也許和 Functor Class

在 Haskell 中,資料型別可以像函式一樣具有引數。以 Maybe 型別為例。

Maybe 是一種非常有用的型別,它允許我們表示失敗的概念或其可能性。換句話說,如果計算失敗的可能性,我們在那裡使用 Maybe 型別。Maybe 有點像其他型別的包裝器,為它們提供了額外的功能。

它的實際宣告非常簡單。

Maybe a = Just a | Nothing

這說明了一個 Maybe 有兩種形式,一種代表成功的 Just,另一種代表失敗的 NothingJust 採用一個引數來確定 Maybe 的型別,Nothing 不採用任何引數。例如,值 Just "foo" 將具有 Maybe String 型別,這是一個包含附加 Maybe 功能的字串型別。值 Nothing 的型別為 Maybe a,其中 a 可以是任何型別。

包裝型別以提供額外功能的想法是非常有用的,並且不僅適用於 Maybe。其他示例包括 EitherIO 和列表型別,每個型別提供不同的功能。但是,所有這些包裝器型別都有一些共同的操作和功能。其中最值得注意的是修改封裝值的能力。

通常將這些型別視為可以在其中放置值的框。不同的框具有不同的值並執行不同的操作,但如果不能訪問其中的內容,則沒有任何框可用。

為了封裝這個想法,Haskell 帶有一個名為 Functor 的標準型別類。它的定義如下。

class Functor f where
  fmap :: (a -> b) -> f a -> f b

可以看出,該類具有兩個引數的單個函式 fmap。第一個引數是從一種型別 a 到另一種型別 b 的函式。第二個引數是包含 a 型別值的仿函式(包裝型別)。它返回一個包含 b 型別值的仿函式(包裝型別)。

簡單來說,fmap 採用函式並應用於仿函式內部的值。它是型別成為 Functor 類成員所必需的唯一函式,但它非常有用。在 ApplicativeMonad 型別類中可以找到在具有更多特定應用程式的仿函式上執行的函式。