iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0
Software Development

mostly:functional 從零開始的異世界程式觀 --- 函數式程式設計的試煉系列 第 29

mostly:functional 第二十六章的試煉:Functor 的證明

一樣是上次那個模仿 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 是什麼了」。

  1. 能幫我們之前做出來的溫度,做出 Functor 的實例嗎?
data Temp = Celsius Float | Fahrenheit Float
  deriving (Show)

instance Functor Temp where
  fmap = ???

上一篇
mostly:functional 第二十六章:升格,再一次升格,然後再…
下一篇
mostly:functional 第二十七章:Applicative 的法則
系列文
mostly:functional 從零開始的異世界程式觀 --- 函數式程式設計的試煉35

1 則留言

0
taiansu
iT邦新手 5 級 ‧ 2020-10-12 14:00:26

新增一個題目

我要留言

立即登入留言