4

我是编程和 Haskell 的新手。我无法理解如何定义函数。假设我想要一个函数,它将返回列表[b]的位置a中的元素。对于特定的 a[b]我可以在解释器中执行此操作:

Prelude> [2, 3, 5, 6] !! 1
Prelude> 3

但是,如果我尝试在解释器或然后加载的文本编辑器中创建一个函数,我就会遇到麻烦:

Prelude> let getElement a [b] = [b] !! a 
Prelude> getElement 1 [2, 3, 5, 6]
***Exception: <interactive>:17:5-27: Non-exhaustive pattern in function getElement
4

1 回答 1

6

让 getElement a [b] = [b] !! 一个

您的函数接受一个a类型的参数Int,因为(!!)第二个参数是一个 Int,并且[b]模式匹配一​​个具有一个元素的列表。

看起来您试图告诉编译器第二个参数应该是一个列表。为此,您通常使用类型签名。

在一个文件中:

getElement :: Int -> [b] -> b
getElement a bs = bs !! a

这种类型的函数被认为是部分函数,​​因为您可以给它一个整数,导致函数失败并抛出异常,例如负数或尝试访问比列表更大的索引。本章在现实世界中的 Haskell 中有一些关于偏函数的信息。编程指南页面上的 Haskell wiki 也有一些建议

您可能想查看 安全包以及它们如何定义headMay以实现全部而不是部分实现。

编辑:b更改bs为下面 Rein Henrichs 的建议,因为他指出它确实更容易阅读并且是一个相当常见的习语。

于 2013-09-01T23:58:03.120 回答