gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:05:06 24 4
gpt4 key购买 nike

我的问题受到这个问题的启发:link

这是一个代码:

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

let f (A.X(a, b)) = a + b

它有效,但有警告:

说得通;我没有 Y 的对手。

但是如果我添加一行
    let f (A.Y(s)) = 10

然后我得到一个错误:

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

最佳答案

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

let f = function
| X(a, b) -> a + b
| Y(_) -> 10

当你定义
let f (A.X(a, b)) = a + b 
f 的类型是 A -> int ,而不是 A.X -> int 。它不是为 A.Y 实例的值定义的,因此您会收到不完整匹配警告。

您对 f 的第二个定义也具有 A -> int 类型,因此是第一个的重复定义,因此出现错误。如果你想在某个联合类型上编写一个完整的函数,你应该使用模式匹配与 functionmatch

编辑:作为对评论的回应,如果您有多个要同时匹配的参数,您可以使用 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

关于f# - 通过函数调用区分联合模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21405350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com