我是Haskell的新手,一般來說,函數式編程,我的語法有點不舒服。Haskell中=>符號的含義是什麼?
在下面的代碼=>
表示什麼?還有(Num a, Ord a)
?
loop :: (Num a, Ord a) => a -> (t -> t) -> t -> t
我是Haskell的新手,一般來說,函數式編程,我的語法有點不舒服。Haskell中=>符號的含義是什麼?
在下面的代碼=>
表示什麼?還有(Num a, Ord a)
?
loop :: (Num a, Ord a) => a -> (t -> t) -> t -> t
這是一個typeclass約束; (Num a, Ord a) => ...
表示loop
與a
一起使用,該類型是Num
和Ord
類型類別的實例,分別對應於數字類型和有序類型。基本上,您可以將loop
認爲是=>
右側的類型,但要求a
是Num
和Ord
的實例。
您可以將類型類視爲基本上類似於OOP接口(但它們不是同一件事!) - 它們封裝了任何實例必須支持的一組定義,並且可以使用這些定義來編寫泛型代碼。例如,Num
包括數字操作,如加法和乘法,而Ord
包括小於,大於等等。
有關特殊類的更多信息,請參閱Learn You a Haskell的this introduction。
論左側=>
聲明對於那些在右邊使用的類型限制。
在您給出的示例中,這意味着a
被限制爲Ord
類型類和Num
類型類的實例。
=>
分離型簽名兩個部分組成:
所以,你能想到的(Num a, Ord a) => a -> (t -> t) -> t -> t
的意義「類型爲a -> (t -> t) -> t -> t
,並且還必須有a
的Num
實例和a
的Ord
實例「。
更多關於類型類看去想它是Ord a
和Num a
額外的輸入功能http://www.learnyouahaskell.com/types-and-typeclasses
的一種方式。它們是一種特殊的輸入:字典。當您使用特定類型a
的此功能時,還必須有字典可用於類型a
的Ord
和Num
操作。
任何使用字典輸入功能的函數也必須具有相同的字典輸入。
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
是必需的輸入(假設它滿足其它要求,當然)。
值得澄清的是,雖然我們稱之爲「詞典」,但它們並不是哈希表,而是函數的記錄。它們有點像面嚮對象語言中的v-表格,只是它們沒有附加到值。 – hammar 2012-02-04 22:19:28