模式匹配多个变量

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是对的.以下是一些其他说明:

  1. a并且b已经在范围内,所以你不需要匹配它们,你可以匹配任何东西:

    let fun1 (a,b) =
        match () with
        | () when a + b > 0 -> fun2
        | () when a + b < 0 -> fun3
    
    Run Code Online (Sandbox Code Playgroud)
  2. 出于这个原因,使用if语句可能更惯用.

  3. 你明显错过了这个案子a + b = 0; 请注意,编译器总是假定when子句可能不包含任何内容,因此即使添加了一个| () when a + b = 0 -> ...案例,您仍会收到一些警告,即某些案例可能无法处理; 你需要做| () -> ...或只做| _ -> ....

  4. 表单的定义有一个内置的快捷方式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不受函数定义的约束,因此我的第一个注释中的想法不适用,您必须在模式中引入它们.