Home Articles

Haskell:模式匹配(x:_):为什么列表头限于x?

Asked
Viewed 1894 times
0

只是在这里与Haskell挣扎......我的术语非常糟糕,鉴于我的母语不是英语,进行正确的搜索有点复杂:P我正在关注一些haskell教程/书籍(了解你一个Haskell,Real World Haskell,Happy Learn Haskell,也是一个邮件列表,以及一些随机页面),现在我已经停在这里:

head' :: [Char] -> Char
head' (x:_) = x

此函数接收String类型的元素列表,如果我像这样应用它:

head' "hello"

它返回"h",它与x有界,"ello"与_有界,但无关紧要,因为我不使用它 . 我理解(:)函数(或用作中缀运算符)接收一个元素,它将被放入一个新列表的开始,其尾部将是另一个接收元素: 'a' : ['b', 'c'] 将返回"abc"但是,为什么当我使用":"括号内,第一个元素是x,其余的是_?这里发生了什么?

我读了几个像这样的问题(x:xs) pattern Haskell logic和这个(我更接近于回答我的问题)What does (x:_) and [x:_] mean?但是最后一个问题的接受问题是:“:是列表的构造函数,它取了新列表的头部作为左边的参数,尾部作为右边的参数. If you use it as a pattern like here that means that the head of the list you match is given to the right pattern and the tail to the left.

“列表的头部是右边的,尾部是左边的”......它真的让我感到困惑:如果头部被赋予“_”而尾部被赋予“x”,当模式使用“:”时匹配,为什么x具有列表头的值?

我想也许是我糟糕的英语水平让我很难掌握这个哈哈 . 我也会欣赏一些提示(如特定搜索)而不是直接回答:)

谢谢 :)


编辑:对于像我这样的另一个菜鸟....正如接受的答案所说,“abcd”只是'a':'b':'c':'d',模式(x:_)匹配'a' :'b'等等,下划线表示“我不关心其余部分”,并接收其余的字符 . 只是 :)

1 Answer

  • 8

    列表数据类型定义如下:

    data [a] = [] | a : [a]

    这意味着 a 的列表是空的,或者是使用 :cons )构造函数附加到尾部元素的头元素 .

    在列表上进行模式匹配时,可以为这两种情况中的每一种定义函数 . 在 head' 的情况下,它只是在给出一个空列表时失败,所以我们只匹配一个案例: a : [a] case .

    如果您调用 head' "hello" (因为它现在存在,包含类型签名),它应该失败,因为 "hello" 实际上是 String - Haskell中 [Char] 的别名 . "hello"仅仅是以下结构的语法糖:

    "hello" = 'h':'e':'l':'l':'o':[]

    因此,当您使用 head' 在列表上进行模式匹配时,您会在第一个 : 的左侧获得 'h' ,而列表的其余部分(我们不关心)将绑定到 _ .

Related