2012-11-24 44 views
6

根據this question第二函子法是由第一哈斯克爾暗示:哈斯克爾首先函子法從二

1st Law: fmap id = id 
2nd Law : fmap (g . h) = (fmap g) . (fmap h) 

是相反的是真的嗎?從第二定律開始,並且設置g等於id,我可以推理以下並獲得第一定律嗎?

fmap (id . h) x = (fmap id) . (fmap h) x 
fmap h x = (fmap id) . (fmap h) x 
x' = (fmap id) x' 
fmap id = id 

其中x' = fmap h x

回答

11

沒有

data Break a = Yes | No 

instance Functor Break where 
    fmap f _ = No 

明確第二定律認爲

fmap (f . g) = const No = const No . fmap g = fmap f . fmap g 

,但第一定律沒有。與您的論點不一樣的問題x'的形式是fmap f x

7

不,它只適用於一個方向。

考慮這個Functor實例:

data Foo a = Foo Int a 

instance Functor Foo where 
    fmap f (Foo _ x) = Foo 5 (f x) 

它滿足第二定律,但不是第一個。

在證明的最後一步是無效的 - 你發現fmap id x' = x',但這僅限於從fmap首先返回,而不是任意值x'秒。