(:)在Haskell中做了什么?

Mdo*_*n45 5 haskell

我试过在hoogle和其他各种haskell词典中查找它,但我找不到它.我的印象是它的前提,但我开始以前所未有的方式看到它,我开始猜测自己.

例如,这是我不理解的问题之一:

(3分)用一个模式填充空白,使fun1 [(5,6),(7,8)]返回5和fun1 [(10,20),(30,40),(50,60)]返回10:

答案显然是:

         ((y,_):_)
  fun1 _____________ = y
Run Code Online (Sandbox Code Playgroud)

但我对此感到困惑.我理解,下划线意味着你并不真正关心那些类型是什么,但我不明白(:)在这个答案中做了什么.

Cub*_*bic 7

而另一个答案正确地解释了:他们没有完全回答这个问题 - 在你的问题中你的答案中:没有用作函数,而是用作模式匹配的构造函数.fun (x:xs) = x意思是"如果参数是格式(x:xs)给我x".模式匹配用于根据Haskell中的构造函数"拆分"复杂类型.

特别是,因为:是一个列表构造函数,你可以拆开列表:

(概念上列表被定义为data [] a = [] | (:) a [a],虽然你不会得到它编译,因为它是内置语法).

非列表示例:我们可以定义数据类型data F a b = A a | B b.这将创建一个类型F一个与两类参数ab和两个构造AB同类型a -> F a bb -> 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
Run Code Online (Sandbox Code Playgroud)

要么

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!
Run Code Online (Sandbox Code Playgroud)


Sib*_*ibi 5

它是一个 List 构造函数。它用于在列表前面添加任何值。

ghci> 2 : [3,4]
[2,3,4]
Run Code Online (Sandbox Code Playgroud)

它只是另一个 Haskell 函数。您还可以在 ghci 中看到它的类型:

ghci> :t (:)
(:) :: a -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

关于你的问题,答案是这样的,((y,_):_)因为它被用于模式匹配。第一个_是该对的第二个元素,第二个_模式匹配一​​个列表。

这可能会帮助您:

ghci> (5,6):[(7,8)]
[(5,6),(7,8)]
Run Code Online (Sandbox Code Playgroud)