一樣是上次那個模仿 Maybe 行為的 type:
-- Haskell 語法
data MightBe = NoThanks | Ok a deriving (Eq, Show)
那麼我們可以這樣幫它實作 Functor 的 typeclass:
-- Haskell 語法
instance Functor (MightBe a) where
fmap _ NoThanks = NoThansk
fmap f (Ok a) = OK (f a)
-- 試試看
fmap (+1) $ NoThanks -- => NoThanks
fmap (+1) $ Ok 1 -- => Ok 2
能不能幫這些東西做出 Monoid 的實體呢?
data Double a a = Double a a
-- 希望能
fmap (+1) $ Double 1 1 -- => Double 2 2
fmap (++ "test") $ Double "a" "b" --> Double "atest" "btest"
模仿 Tuple。
data Pair a b = Pair a b
-- 希望能
fmap (+1) $ Double "a" 1 -- => Double "a" 2
fmap (++ "test") $ Double "foo" "a" -- => Double "foo" "atest"
註:能夠做出這題,就可以知道為什麼 Tuple 類的 functor 都只能動到最後一個元素,因為「真的只能這樣,不這樣無法實作」。於是就能對 typeclass 的「實作即證明」感覺更有體會。個人意見是覺得,能夠證出來才比較可以表示「我瞭解某 typeclass 是什麼了」。
data Temp = Celsius Float | Fahrenheit Float
deriving (Show)
instance Functor Temp where
fmap = ???