IT干货网

haskell之什么(:) do in Haskell

yyy_WW 2026年09月08日 编程设计 174 0

这个问题在这里已经有了答案:





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! 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!