Haskell - 定义函数

标签 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

最佳答案

let getElement a [b] = [b] !! a

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

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

在文件中:

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

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

您可能想查看 safe包及其定义方式 headMay全面而非部分实现。

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

关于Haskell - 定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18563851/

相关文章:

haskell - 这个haskell表达式是如何评估的

haskell - 为什么这个 Haskell 代码不会终止?

haskell - Yesod重定向到页面上的 anchor

在 haskell 中对列表的列表进行排序

haskell - Church naturals、求幂函数和类型检查

haskell - "Not in scope: ‘trace"是什么意思,我该如何解决?

java - 约束接口(interface)实现

haskell - Reactive Banana 1.0.0 - 为什么这个旧代码会被破坏?

haskell - 你能 "partially"派生一个 Typeclass 吗?

接受函数和列表并返回 bool 值的函数