Haskell 类型定义,=> 等

标签 haskell

我正在使用 Learn You a Haskell 学习 Haskell。在第 54 页是
take 的实现如下:

take' :: (Num i, Ord i) => i -> [a] -> [a]
take' n _
    | n <= 0 = []
take' _ []   = []
take' n (x:xs) = x : take' (n-1) xs

我理解除了第一行之外的所有代码。

我理解的::部分意味着这是一个类型定义?

(Num i, Ord i) 是一个元组。元组的第一个元素必须是
数字,足够公平。第二个参数必须能够被订购。
参数是相同的 - 都是 i。这意味着类型
必须相同吗?

为什么不是 (Num i, Ord j)?不是第二个元组元素
指的是 list ?哪个可以是任何类型?

=> 是什么意思?

i -> [a] -> [a] 表示第一个参数是数字?第二个参数是任何
类型列表,第三个参数是任何类型列表。所以这是说第一个参数
数字,第二个参数是任何类型的列表,它返回任何类型的列表
类型。我想这是可以理解的。

最佳答案

=>之前的东东是约束。 (Num i, Ord i)并不是通常意义上的元组。它规定了对于任何特定类型都存在类型类实例的要求 i你用它调用函数。

所以这个类型签名实际上是说 take' 的类型是 i -> [a] -> [a] ,但附加限制是 i必须有 NumOrd实例,这相当于要求您可以做一些基本的算术运算(我认为 Num 是“数字”的缩写)并比较哪个值更大(Ord 表示该类型的值具有已定义的排序,即您可以排序他们之类的)。

在这种特殊情况下,比较 n <= 0是什么用Ord ,而减法和数字文字使用 Num .

这在 chapter 3 of LYAH 中有介绍,这些特定的类型类(以及其他)在 the Typeclasses 101 section 中提到.

关于Haskell 类型定义,=> 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15927000/

相关文章:

haskell - 在 Haskell 中定义函数并在参数中进行计算

haskell - "Any function on finite lists that is defined by pairing the desired result with the argument list can always be redefined in terms of fold"

generics - 使用 GHC.Generics 或 Data.Data 类型族

haskell - 任何与 fmap 具有相同多态类型的函数都必须等于 fmap?

user-interface - 构建 Haskell (gtk2hs) GUI

list - 使用 foldr 将列表分成指定大小的子列表

testing - 如何在 SmallCheck 中使用 monadic 属性?

haskell - 获取Data.Tree中节点的父级(haskell)

haskell - cabal build --ghc-options ="-fforce-recomp -Wall -fno-code"失败

haskell - 计数枚举值的频率