2013-04-10 61 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」一章。