Haskell:函数中的非穷举模式(简单函数)

时间:2013-02-15 15:07:11

标签: haskell non-exhaustive-patterns

我很困惑为什么这个函数的第1版和第3版给出了这个错误,而第二个定义工作正常。

-- head and tail
third :: [a] -> a
third [a] = head (tail (tail[a]))

-- Pattern matching
third2 :: [a] -> a
third2 (_:_:x:_) = x

-- List indexing
third3 :: [a] -> a
third3 [a] = [a]!!2

提前致谢

2 个答案:

答案 0 :(得分:4)

奇怪的是,第二个人并没有抱怨非详尽无遗 模式,因为third2将不匹配长度为零,一或两个的列表。 thirdthird3函数会抱怨,因为[a]不是变量, 这是一种模式。 [a]去了(a:[]),所以你可以把它们写成

third (a:[]) = head (tail (a:[]))

third3 (a:[]) = (a:[]) !! 2

这两者都不起作用,因为它们是单个元素列表。 我怀疑你想要的是什么

third a = head (tail a)

third3 a = a !! 2

答案 1 :(得分:1)

您需要更好地理解语法。

基本上,有两种子语法:

  1. 类型
  2. 的语法
  3. 表达式和模式的语法
  4. 在类型语法中,[a]表示list of elements of type a

    在表达式/模式语法中,[a]表示单例列表,其中包含值a。这相当于(a:[])(在空列表的前面加上)。

    因此,您的第一个函数会检查它是否获得单例列表。然后它采用单个列表尾部尾部的头部,这将失败。

    您收到的消息是因为您没有涵盖的列表形状:即空列表和包含多个元素的列表。

    当然,您应该收到third2的警告,它是否仅涵盖包含3个或更多元素的列表。我相信你会忽略一些东西。