Haskell - 定义函数

时间:2013-09-01 23:17:19

标签: haskell

我是编程和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

1 个答案:

答案 0 :(得分:6)

  

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

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

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

在档案中:

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

这种类型的函数被认为是部分函数,​​因为你可以给它一个整数,导致函数失败并抛出异常,例如负数或尝试访问大于列表的索引。现实世界中的This chapter Haskell有一些关于部分功能的信息。编程指南页面上的Haskell wiki有some advise too

你可能想看一下 safe包以及他们如何定义headMay以完全实现,而不是部分实现。

修改:b改为bs,正如下面的Rein Henrichs所推荐的那样,因为他指出它确实让它更容易阅读并且是一种相当常见的习惯用法。