根据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 = idwhere x' = fmap h x
发布于 2012-11-24 15:59:30
不是
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形式的
发布于 2012-11-24 15:59:37
不,它只在一个方向上起作用。
考虑下面的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',而不是任意值。
https://stackoverflow.com/questions/13539335
复制相似问题