这个问题在这里已经有了答案:
What does the : infix operator do in Haskell?
(4 个回答)
8年前关闭。
我试过在 hoogle 和其他各种 haskell 字典中查找它,但我找不到它。我的印象是它在前面,但我开始以前所未有的方式看待它,我开始怀疑自己。
例如,这是我不明白的问题之一:
(3 分)用一个模式填空,使得 fun1 [(5,6),(7,8)] 返回
5 和 fun1 [(10,20),(30,40),(50,60)] 返回 10:
答案显然是:
((y,_):_)
fun1 _____________ = y
但我对此感到非常困惑。我知道下划线意味着您并不真正关心这些类型是什么,但我不明白 (:) 在这个答案中的作用。
请您参考如下方法:
虽然其他答案正确解释了 :他们是否没有完全回答问题 - 在您的问题中的答案中 :不用作函数,而是用作模式匹配的构造函数。 fun (x:xs) = x表示“如果参数的格式为 (x:xs),请给我 x”。模式匹配用于根据 Haskell 中的构造函数“分离”复杂类型。
特别是,由于 :是一个列表构造函数,您可以使用 : 拆分列表
(从概念上讲,列表定义为 data [] a = [] | (:) a [a],尽管您不会编译它,因为它是内置语法)。
非列表示例:我们可以定义数据类型 data F a b = A a | B b .这将创建一个类型 F用两种类型参数化 a和 b和两个构造函数 A和 B类型为 a -> F a b和 b -> F a b分别。
然后,您可以编写使用模式匹配来获取包含值的函数,例如
isA (A _) = True -- this value was constructed with A, so it is an A
isA (B _) = False -- this value was constructed with B so it is not an A
或者
getA (A a) = a -- this value was constructed with A so we can get an a out of it
getA (B _) = undefined -- ohps! We can't get an a back here cause we don't have one!




