我正在使用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是任何类型的列表,它返回任何类型的列表 类型。嗯,这是可以理解的。
答案 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”一章。