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 = ???

<<:  [Day 28] 订阅(2)

>>:  RxJS 条件/布林类型 Operators (1) - isEmpty / defaultIfEmpty / find / finxIndex / every

JavaScript Day20 - AJAX(2)

ES6:fetch fetch():Fetch API 提供了一个能获取包含跨网路资源在的资源介面,...

未来狂想:国防军事

人的科技文明发展始终来自於人性 奠基於各国的工业发展水准发达及科技发展的技术发达,在这两大的基石之上...

[30天 Vue学好学满 DAY8] v-bind

v-bind 属性绑定 将属性绑定於 HTML 中,可绑定Data、Class、Style v-bi...

Day25 UDP Swift小实作3!

接续昨天~ 今天我们要写入的部分是按钮。 一开始来到bind绑定port的按钮。 我们利用do ca...

Day 4 该说的还是要先说!

有时候,嗯!没错~有时候吧?某些事情不是只属於你一个人的,而是旁边有人默默的发光照耀着你,就像黑夜里...