[英]Haskell - defining functions
我是编程和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
让getElement a [b] = [b] !! 一个
你的函数接受一个Int
类型的参数a
,因为(!!)
第二个参数是一个Int,而[b]
模式匹配一个元素的列表。
看起来你试图告诉编译器第二个参数应该是一个列表。 为此,您通常使用类型签名。
在文件中:
getElement :: Int -> [b] -> b
getElement a bs = bs !! a
这种类型的函数被认为是部分函数,因为您可以给它一个整数,导致函数失败并抛出异常,例如负数或尝试访问大于列表的索引。 现实世界中的这一章 Haskell有一些关于部分函数的信息。 编程指南页面上的Haskell wiki也有一些建议 。
您可能希望查看安全包以及它们如何定义headMay以进行总体而非部分实现。
编辑: b
改为按照下面的Rein Henrichs推荐的bs
,因为他指出它确实使它更容易阅读,并且是一个相当常见的习语。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.