Jav*_*ini 11 f# tuples pattern-matching
我是F#的新手,并没有在任何地方看到如何正确地执行以下操作
let fun1 a b =
match a b with
| a + b > 0 -> fun2
| a + b < 0 -> fun3
Run Code Online (Sandbox Code Playgroud)
我必须使用模式匹配 - 做作业 - 但我不知道如何正确地做到这一点.我以为我可以使用如下元组:
let fun1 (a,b) =
match (a,b) with
| (a,b) when a + b > 0 -> fun2
| (a,b) when a + b < 0 -> fun3
Run Code Online (Sandbox Code Playgroud)
但这也行不通.我该怎么办?
Sør*_*ois 14
你有正确的想法,你忘记了缩进在F#中很重要.添加空间使您可以解决方案:
let fun1 (a,b) =
match (a,b) with
| (a,b) when a + b > 0 -> fun2
| (a,b) when a + b < 0 -> fun3
Run Code Online (Sandbox Code Playgroud)
这实际上模式匹配两次,所以我们可能想要重写它:
let fun1 t = function
| (a,b) when a + b > 0 -> fun2
| (a,b) when a + b < 0 -> fun3
Run Code Online (Sandbox Code Playgroud)
编译器/解释器会让它通过,但有一个警告:
警告FS0025:此表达式上的不完整模式匹配.
我会把它当作一项练习而放弃:-)
PS.很高兴你能够提前做好这项工作.
kvb*_*kvb 10
SørenDebois是对的.以下是一些其他说明:
a并且b已经在范围内,所以你不需要匹配它们,你可以匹配任何东西:
let fun1 (a,b) =
match () with
| () when a + b > 0 -> fun2
| () when a + b < 0 -> fun3
Run Code Online (Sandbox Code Playgroud)出于这个原因,使用if语句可能更惯用.
你明显错过了这个案子a + b = 0; 请注意,编译器总是假定when子句可能不包含任何内容,因此即使添加了一个| () when a + b = 0 -> ...案例,您仍会收到一些警告,即某些案例可能无法处理; 你需要做| () -> ...或只做| _ -> ....
表单的定义有一个内置的快捷方式let f <pattern> = match <same pattern> with |...,即let f = function |....你会像以下一样使用它:
let fun1 = function
| (a,b) when a + b > 0 -> fun2
| ...
Run Code Online (Sandbox Code Playgroud)
请注意,现在a并且b不受函数定义的约束,因此我的第一个注释中的想法不适用,您必须在模式中引入它们.