也許和 Functor Class
在 Haskell 中,資料型別可以像函式一樣具有引數。以 Maybe
型別為例。
Maybe
是一種非常有用的型別,它允許我們表示失敗的概念或其可能性。換句話說,如果計算失敗的可能性,我們在那裡使用 Maybe
型別。Maybe
有點像其他型別的包裝器,為它們提供了額外的功能。
它的實際宣告非常簡單。
Maybe a = Just a | Nothing
這說明了一個 Maybe
有兩種形式,一種代表成功的 Just
,另一種代表失敗的 Nothing
。Just
採用一個引數來確定 Maybe
的型別,Nothing
不採用任何引數。例如,值 Just "foo"
將具有 Maybe String
型別,這是一個包含附加 Maybe
功能的字串型別。值 Nothing
的型別為 Maybe a
,其中 a
可以是任何型別。
包裝型別以提供額外功能的想法是非常有用的,並且不僅適用於 Maybe
。其他示例包括 Either
,IO
和列表型別,每個型別提供不同的功能。但是,所有這些包裝器型別都有一些共同的操作和功能。其中最值得注意的是修改封裝值的能力。
通常將這些型別視為可以在其中放置值的框。不同的框具有不同的值並執行不同的操作,但如果不能訪問其中的內容,則沒有任何框可用。
為了封裝這個想法,Haskell 帶有一個名為 Functor
的標準型別類。它的定義如下。
class Functor f where
fmap :: (a -> b) -> f a -> f b
可以看出,該類具有兩個引數的單個函式 fmap
。第一個引數是從一種型別 a
到另一種型別 b
的函式。第二個引數是包含 a
型別值的仿函式(包裝型別)。它返回一個包含 b
型別值的仿函式(包裝型別)。
簡單來說,fmap
採用函式並應用於仿函式內部的值。它是型別成為 Functor
類成員所必需的唯一函式,但它非常有用。在 Applicative
和 Monad
型別類中可以找到在具有更多特定應用程式的仿函式上執行的函式。