仿函數的數學定義以下函數
設 C 和 D 爲集合,從 C 至 D 有一映射F 將每一個對象 X ∈ C 映射至一對象 F(X) ∈ D 上, 將每一個態射 f:X ⟶ Y ∈ C 映射至一態射 F(f):F(X) ⟶ F(Y) ∈ D 上,
Haskell的仿函數是一個class,其中主要的抽象函數是fmapspa
fmap :: (a -> b) -> f a -> f b
Haskell在Functor的註釋中提到了Haskell仿函數的兩條規則。code
第一條是,若是咱們使用函數id做爲映射,那麼咱們的返回結果應當是做爲參數仿函數orm
Haskell的表達方式以下 fmap id a = a 數學表達方式以下 對任何對象 X ∈ C,恆有 F(id(x)) = id(F(x))
第二條是,使用組合函數做爲映射,獲得的結果,應當保證同組合函數中的函數按照順序做爲映射函數的結果相同。對象
Haskell的表達式以下 fmap (f . g) = fmap f . fmap g 或者 fmap (f . g) F = fmap f (fmap g F) 數學表達方式以下 F(f.g) = F(g).F(f)