【问题标题】:Haskell take first and seventhHaskell 获得第一和第七
【发布时间】:2019-02-04 15:07:00
【问题描述】:

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

例如

Prelude> take1and7 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
(1, 7)

我试过了

take1and7 :: [a] -> (a, a)
take1and7 [a, b, c, d, e, f, g, xs] = (a, g)

但它说它具有我不理解的“非详尽模式”

【问题讨论】:

  • 你想要take1and7 (a:b:c:d:e:f:g:xs) = (a, g)。 (如果需要,我很乐意进一步解释,但自从我开始输入此内容后,我发现答案已经上升了 :))
  • 你必须使用模式匹配吗?一个更容易阅读的实现是使用!!

标签: haskell syntax functional-programming pattern-matching non-exhaustive-patterns


【解决方案1】:
... [a, b, c, d, e, f, g, xs] = ...

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

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

... (a: b: c: d: e: f: g: xs) = ...

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

“非详尽”措辞意味着我们的函数无法处理所有可能的情况。

【讨论】:

  • 我现在收到一个新错误Occurs check: cannot construct the infinite type: a ~ [a] • In the pattern: a : b : c : d : e : f : g : xs In the pattern: [a : b : c : d : e : f : g : xs] In an equation for ‘take1and7’: take1and7 [a : b : c : d : e : f : g : xs] = (a, g)
  • NB:(a : xs) 圆括号。
  • @Huddlespith 看起来您误读了答案中的代码。您应该使用(),而不是方括号。您可以使用方括号或 : 运算符构造一个列表,但同时使用这两种方法并不是一个好主意。
  • 如果您没有获得包含 7 个或更多项目的列表,您仍然需要指出函数应该“返回”什么,如果您想避免非详尽无遗模式警告。这可以像take1and7 _ = error "List has too few elements" 一样简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多