通过函数调用区分联合模式匹配

Rus*_*tam 4 f# pattern-matching discriminated-union

我的问题受到这个问题的启发:链接

这是一个代码:

    type A = 
        | X of int * int
        | Y of string

    let f (A.X(a, b)) = a + b 
Run Code Online (Sandbox Code Playgroud)

它有效,但有警告: 警告

说得通; 我和Y没有比赛.

但是,如果我添加一行

    let f (A.Y(s)) = 10
Run Code Online (Sandbox Code Playgroud)

然后我收到一个错误:

错误

有没有一种很好的方法来修复它并仍然在函数参数中使用模式匹配?如果没有,那么为什么他们会创建这样奇怪的语法,这总是会引发警告?

Lee*_*Lee 8

您需要在参数上进行模式匹配:

let f = function
| X(a, b) -> a + b
| Y(_) -> 10
Run Code Online (Sandbox Code Playgroud)

当你定义

let f (A.X(a, b)) = a + b 
Run Code Online (Sandbox Code Playgroud)

f有类型A -> int,不是A.X -> int.它没有为作为实例的值定义A.Y,因此您得到不完整的匹配警告.

你的第二个定义f也有类型A -> int,因此是第一个的重复定义,因此是错误.如果要在某种联合类型上编写一个总函数,则应使用function或与模式匹配match.

编辑:在回复评论时,如果您想要同时匹配多个参数,可以使用match例如:

let f a1 a2 =
    match (a1, a2) with
    | (X(a, b), X(a', b')) -> a + b
    | (X(a, b), Y(s)) -> a + 10
    | (Y(s), X(a, b)) -> 10
    | (Y(s), Y(s')) -> 20
Run Code Online (Sandbox Code Playgroud)