你找不到任何例子,因为你的定义符合函子定律。您可以通过对树的深度进行归纳来证明它。基本情况是 0 深度树(即Empty),然后是Node 情况的证明。证明很长但很简单。
编辑:
重新阅读您的问题,也许您正在寻找fmap 的定义,该类型检查但不符合函子定律。只需使用
data BST a = Empty | Node (BST a) a (BST a)
instance Functor BST where
fmap f Empty = Empty
fmap f (Node l val r) = (Node (fmap f r) (f val ) (fmap f l))
-- |- notice |- notice
为什么它不遵守法律?那是你的。以下是您的定义确实成立的证据。尝试建立自己的证据来证明为什么我的定义没有
第一定律
fmap id == id
基本情况
fmap id Empty = Empty -- by definition of fmap
= id Empty -- by definition of id
=> fmap id = id -- by eta-reducing both sides of the equation
递归案例
假设假设对于给定深度D(或更小)的所有树都为真。树一深度的证明(D + 1)
fmap id (Node l val r) = Node (fmap id l) (id val) (fmap id r) -- by definition of fmap
= Node (fmap id l) val (fmap id r) -- by applying id to val
= Node l val r -- by induction hyp. fmap id l == l
= id (Node l val r) -- by definition of id
=> fmap id = id -- by eta-reducing both sides of the equation
第二定律
fmap g . fmap f == fmap (g . f)
基本情况
-- Eq 1
(fmap g . fmap f) Empty = fmap g (fmap f Empty) -- by definition of .
= fmap g Empty -- by definition of fmap
= Empty -- by definition of fmap
-- Eq 2
fmap (g . f) Empty = Empty -- by definition of fmap
-- Therefore
(fmap g . fmap f) Empty = fmap (g . f) Empty -- By transition of equality on Eq1 and Eq2
fmap g . fmap f = fmap (g . f) -- by eta-reducing both sides of the equation
递归案例
假设假设对于给定深度D(或更小)的所有树都为真。树一深度的证明(D + 1)
-- Eq 1
fmap (g . f) (Node l val r) = Node (fmap (g . f) l)
((g . f) val)
(fmap (g . f) r) -- by definition of fmap
= Node ((fmap g . fmap f) l)
((g . f) val)
((fmap g . fmap f) r) -- by induction hyp.
-- Eq 2
(fmap g . fmap f) (Node l val r) = fmap g (fmap f (Node l val r)) -- dy definition of .
= fmap g $ Node (fmap f l)
(f val)
(fmap f r) -- by definition of fmap
= Node (fmap g (fmap f l))
(g (f val))
(fmap g (fmap f r)) -- by definition of fmap
= Node ((fmap g . fmap f) l)
((g . f) val)
((fmap g . fmap f) r) -- by induction hyp.
fmap (g . f) (Node l val r) = (fmap g . fmap f) (Node l val r) -- By transition of equality on Eq1 and Eq2
fmap (g . f) = (fmap g . fmap f) -- by eta-reducing both sides of the equation