1

我有这个inserts功能

inserts 1 [2,3] = [[1,2,3],[2,1,3],[2,3,1]]

这是定义(直接来自 Bird 和 Gibbons 的 Haskell 算法设计)

inserts :: a -> [a] -> [[a]]
inserts x [] = [[x]]
inserts x (y:ys) = (x:y:ys) : map (y:) (inserts x ys)

我已经用上面的例子在 ghci 中尝试过了,但是我得到了以下异常

[[1,2,3],[2,1,3]*** Exception: <interactive>:2:1-53: Non-exhaustive patterns in function inserts

有谁知道缺少的模式是什么?

4

1 回答 1

7

当我inserts根据您的代码定义然后运行inserts 1 [2,3]时,我没有收到任何错误,并且返回了正确的结果。但是,当我这样做时,我可以复制错误:

Prelude> inserts x [] = [[x]]
Prelude> inserts x (y:ys) = (x:y:ys) : map (y:) (inserts x ys)
Prelude>
Prelude> inserts 1 [2,3]
[[1,2,3],[2,1,3]*** Exception: <interactive>:2:1-53: Non-exhaustive patterns in function inserts

所以问题不在于你的功能。相反,您将其错误地输入到 GHCi 中。当你像这样在 GHCi 中输入一个多行函数时,它会定义两个函数而不是一个:首先它定义inserts x [] = [[x]],然后用 覆盖这个定义inserts x (y:ys) = (x:y:ys) : map (y:) (inserts x ys)。将多行函数输入 GHCi 的正确方法是用 包围定义:{ :}

Prelude> :{
Prelude| inserts :: a -> [a] -> [[a]]
Prelude| inserts x [] = [[x]]
Prelude| inserts x (y:ys) = (x:y:ys) : map (y:) (inserts x ys)
Prelude| :}
Prelude> inserts 1 [2,3]
[[1,2,3],[2,1,3],[2,3,1]]
于 2021-02-01T12:12:25.210 回答