Haskell类型定义,=>等等

时间:2013-04-10 13:18:33

标签: haskell

我正在使用Learn You a Haskell学习Haskell。在页54是一个 像这样执行:

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)是一个元组。元组的第一个元素必须是 数字,公平。必须能够订购第二个参数。 参数是相同的 - 都是我。这意味着类型 必须是一样的吗?

为什么不呢(Num i,Ord j)?不是第二元组元素 参考清单?哪个可以是任何类型?

= =&gt;表示?

i - &gt; [a] - &gt; [a]表示第一个参数是数字?第二个参数是任何 类型列表,第三个参数是任何类型列表。所以这就是说第一个参数 numeric,2nd param是任何类型的列表,它返回任何类型的列表 类型。嗯,这是可以理解的。

2 个答案:

答案 0 :(得分:12)

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

这个类型签名实际上说的是take'的类型是i -> [a] -> [a],但i必须有Num和{{1}的附加限制实例,这相当于要求你可以做一些基本的算术(我认为Ord是“数字”的缩写)并比较哪个值更大(Num意味着该类型的值有一个排序定义,即你可以对它们进行排序等。)

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

chapter 3 of LYAH中介绍了这一点,the Typeclasses 101 section中提到了这些特定类型(以及其他类型)。

答案 1 :(得分:2)

(Num i,Ord i)并不是一个元组。读取类型签名为:take'是类型i -> [a] -> [a]的函数,其中i必须是类型为Num和Ord的类型。

您可能想再次阅读“Typeclasses 101”一章。