哈斯克尔获得第一名和第七名

Hud*_*ith 0 syntax haskell functional-programming pattern-matching non-exhaustive-patterns

我需要在Haskell中编写一个函数,给定一个至少包含7个元素的列表,返回一个包含第一个和第七个元素的元组.

例如

Prelude> take1and7 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(1, 7)
Run Code Online (Sandbox Code Playgroud)

我试过这个

take1and7 :: [a] -> (a, a)
take1and7 [a, b, c, d, e, f, g, xs] = (a, g)
Run Code Online (Sandbox Code Playgroud)

但它说它有"非详尽的模式",我不明白

Wil*_*ess 7

... [a, b, c, d, e, f, g, xs] = ...
Run Code Online (Sandbox Code Playgroud)

是一个匹配8个元素长列表的模式.xs命名第8个元素,而不是列表的其余部分.

如果您使用6,7,9等元素列表调用此函数,则模式将不匹配.

... (a: b: c: d: e: f: g: xs) = ...
Run Code Online (Sandbox Code Playgroud)

是一个匹配7个元素或更长元素列表的模式.在其前7个元素之后xs命名列表的其余部分.有了它,该函数仍然无法处理任何短于7个元素的列表.

"非详尽的"措辞意味着我们的功能不能处理所有可能的情况.

  • NB:`(a:xs)`圆形的parens. (4认同)
  • @Huddlespith看起来你误解了答案中的代码.你应该使用`(`和`)`,而不是方括号.您可以使用方括号或`:`运算符构造一个列表,但使用它们并不是一个好主意. (3认同)
  • 如果你不*获取包含7个或更多项目的列表,如果你想避免非详尽模式警告,你仍然需要指出该函数应该"返回"的内容.这可能就像`take1and7 _ = error"一样简单"List中的元素太少了"`. (2认同)