如何修复“功能中的非穷举模式”

时间:2019-06-14 04:09:33

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

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

如此map f [a] == [f a],您的定义等同于

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

[a]在表达式(在(a : [])右侧出现)或模式(在=左侧)等同于=。 / p>

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

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

详尽的一对列表匹配模式为[](a : as)。一个用于空列表,另一个用于非空列表,其头部元素为a,尾部元素为as

答案 1 :(得分:-3)

解决方案:

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