2012-02-04 68 views
15

我是Haskell的新手,一般來說,函數式編程,我的語法有點不舒服。Haskell中=>符號的含義是什麼?

在下面的代碼=>表示什麼?還有(Num a, Ord a)

loop :: (Num a, Ord a) => a -> (t -> t) -> t -> t 

回答

23

這是一個typeclass約束; (Num a, Ord a) => ...表示loopa一起使用,該類型是NumOrd類型類別的實例,分別對應於數字類型和有序類型。基本上,您可以將loop認爲是=>右側的類型,但要求aNumOrd的實例。

您可以將類型類視爲基本上類似於OOP接口(但它們不是同一件事!) - 它們封裝了任何實例必須支持的一組定義,並且可以使用這些定義來編寫泛型代碼。例如,Num包括數字操作,如加法和乘法,而Ord包括小於,大於等等。

有關特殊類的更多信息,請參閱Learn You a Haskellthis introduction

1

論左側=>聲明對於那些在右邊使用的類型限制。

在您給出的示例中,這意味着a被限制爲Ord類型類和Num類型類的實例。

8

=>分離型簽名兩個部分組成:

  • 在左邊,類型類的約束
  • 在右側,實際類型

所以,你能想到的(Num a, Ord a) => a -> (t -> t) -> t -> t的意義「類型爲a -> (t -> t) -> t -> t,並且還必須有aNum實例和aOrd實例「。

更多關於類型類看去想它是Ord aNum a額外的輸入功能http://www.learnyouahaskell.com/types-and-typeclasses

4

的一種方式。它們是一種特殊的輸入:字典。當您使用特定類型a的此功能時,還必須有字典可用於類型aOrdNum操作。

任何使用字典輸入功能的函數也必須具有相同的字典輸入。

foo :: (Num a, Ord a) => a -> t 
foo x = loop x someFunc someT 

但是,您不必顯式傳遞這些字典。假設有一本可用的字典,Haskell會爲你處理這件事。您可以創建一個類型實例的字典。

instance Num MyType with 
    x + y = ... 
    x - y = ... 
    ... 

這產生上MyType字典用於Num操作,因此MyType可以在任何地方使用的Num a是必需的輸入(假設它滿足其它要求,當然)。

+1

值得澄清的是,雖然我們稱之爲「詞典」,但它們並不是哈希表,而是函數的記錄。它們有點像面嚮對象語言中的v-表格,只是它們沒有附加到值。 – hammar 2012-02-04 22:19:28