0

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

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

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

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

4

2 回答 2

7

[a]是一个单例列表——一个只包含一个元素的列表,a.

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

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

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

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

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

详尽的列表匹配模式对是[](a : as)a一个用于空列表,另一个用于具有 head 元素和 tail的非空列表as

于 2019-06-14T04:39:43.197 回答
-3

解决方案:

fun x = 3 * x + 1
mult :: [Int] -> [Int]
mult (x:xs) = map fun (x:xs)
于 2019-06-14T04:46:09.207 回答