【问题标题】:How to fix "Non-exhaustive patterns in function"如何修复“功能中的非详尽模式”
【发布时间】:2019-06-14 04:09:33
【问题描述】:

我想将一个列表作为参数传递给一个函数,该函数将该列表的每个元素乘以 3。我必须使用递归(我知道怎么做)和映射函数(有问题)。

我正在尝试将列表作为参数传递,正如我在其他帖子中看到的那样,但它不起作用。

fun x = 3 * x + 1
mult :: [Int] -> [Int]
mult [a] = map fun [a]

我试过的代码显示: 例外:x:函数 mult 中的非详尽模式

【问题讨论】:

  • 这些帖子中没有“地图”一词。
  • 确实没有。但是骗子应该足以解决“非详尽模式”异常,这是您问题的症结所在。关于映射/递归...map 已经在一个列表上工作,所以要么使用递归,要么使用map。我不明白你如何能有效地同时使用两者。
  • 我不想一起用。我有一个作业,我必须以三种不同的方式(映射、递归和列表推导)解决问题。我的帖子是明确的,而不是那些。
  • Ah... "我必须使用递归 [...] 和映射函数" ← 我以为 "and" 这里指的是你想同时使用两者。单独运行给定的代码也不会导致任何错误,您应该包括如何调用mult(例如mult [1, 2, 3])。总的来说,你的问题可能更清楚。我个人发现“函数 noThirds 中的非详尽模式”问题足够清晰,可以用非详尽模式解决您的问题。不过威尔下面的回答也不错。

标签: haskell pattern-matching non-exhaustive-patterns


【解决方案1】:

[a] 是一个单例列表——一个仅包含一个元素 a 的列表。

因此map f [a] == [f a],您的定义相当于

mult :: [Int] -> [Int]
mult [a] = [fun a]

[a] 等价于 (a : []),既可以作为表达式(出现在 = 的右侧),也可以作为模式(出现在 = 的左侧)。

(a : []) 是一个表达tail (a : []) == [] 的模式。因此,任何带有非空尾的列表都将无法匹配该模式。任何空列表也将无法匹配它。

这些是您的代码无法处理的情况。因此出现“非详尽模式处理”错误。

完整的列表匹配模式对是[](a : as)。一种用于空列表,另一种用于具有头部元素a 和尾部as 的非空列表。

【讨论】:

  • 感谢分享知识。我的代码确实适用于一个元素列表。
  • 那么作为参数的[][1,2,3] 有什么作用呢?
【解决方案2】:

解决方案:

fun x = 3 * x + 1
mult :: [Int] -> [Int]
mult (x:xs) = map fun (x:xs)

【讨论】:

  • 快到了。试试mult []
  • 您实际上不需要模式匹配。该函数只是mult xs = map fun xs,或无点风格mult = map fun
  • 使用 -Wall 启用警告:这样 GHC 会在您运行程序之前指出哪些情况在编译时未处理。
猜你喜欢
  • 1970-01-01
  • 2018-09-06
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多