【问题标题】:Haskell syntax regarding pattern matching in functions关于函数中模式匹配的 Haskell 语法
【发布时间】:2014-11-16 23:46:28
【问题描述】:

好的,我正在研究这个函数:

myLength :: [a] -> Int
myLength [] = 0
myLength (x:xs) = 1 + myLength xs

但我感到困惑的是最后一行。这部分特别是:(x:xs)

在实现这一点时,我使用了方括号,因为我认为它是一个列表,并且我将它的第一个元素与它的其余元素分开。它是一个元组吗?

第二行和第三行之间似乎有点不匹配。为什么它可以是一个空数组但下一行是一个元组?这是我最初拥有的,并认为它最有意义,但它会引发错误。

myLength :: [a] -> Int
myLength [] = 0
myLength [x:xs] = 1 + myLength xs

我如何知道何时使用括号以及何时使用方括号?

【问题讨论】:

    标签: function haskell pattern-matching tuples


    【解决方案1】:

    (x:xs) 不是元组。括号只是用来表示优先级。 x:xs 是与列表构造函数(即中缀运算符:,通常发音为“cons”)匹配的模式,其中列表头部绑定到变量x,尾部绑定到变量xs . 由于 Haskell 的优先规则,你的第三行没有括号

    myLength x:xs = 1 + myLength xs
    

    会被解析为

    (myLength x):xs = 1 + myLength xs
    

    这没有任何意义,因此您需要将列表模式括在括号中。

    第三行的第二个版本在语法上是有效的,但并不意味着你认为它的意思(并且这里没有正确的类型)。通常,[foo] 是一个列表文字,在这种情况下表示包含foo 的单元素列表。您也可以将[foo] 写为foo:[],它们是同一事物的不同符号。 您的第二个版本 [x:xs] 混合了这两种符号,实际上表示一个嵌套列表,相当于 (x:xs):[],即包含非空列表的单元素列表。

    【讨论】:

      猜你喜欢
      • 2016-04-26
      • 2016-07-21
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多