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)
然后我收到一个错误:

有没有一种很好的方法来修复它并仍然在函数参数中使用模式匹配?如果没有,那么为什么他们会创建这样奇怪的语法,这总是会引发警告?
您需要在参数上进行模式匹配:
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)