2013-04-10 63 views
3

我正在学习Haskell使用学习你一个Haskell。在第54页是 实现负责的,像这样:Haskell类型定义,=>等

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)?是不是第二个元组元素 引用列表?哪些可以是任何类型?

=>是什么意思?

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

回答

12

=>之前的东西是限制(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中提及了这些特定类型类别(以及其他)。

+1

您暗示了这一点,但为了使它更加精确:比较中的n <='部分使用了'Ord',但是按照(heh)与'0'比较,我们需要'Num'。这就保证了'0'文字可以代表与'n'相同的类型(因为'0'实际上是'fromInteger(0 :: Integer)',其中'fromInteger :: Num i => Integer - > i ')。 – 2013-04-10 19:19:16

2

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

您可能需要再次阅读“类型101”一章。