【问题标题】:Does the First Functor Law follow from the Second?第一个函子定律是否遵循第二个?
【发布时间】:2012-11-24 07:40:55
【问题描述】:

根据this question,Haskell 中的第 1 条暗示了第 2 函子定律:

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

【问题讨论】:

    标签: haskell functor


    【解决方案1】:

    没有

    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的形式

    【讨论】:

      【解决方案2】:

      不,它只在一个方向上起作用。

      考虑这个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's,而不是任意值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        • 2019-07-06
        • 1970-01-01
        相关资源
        最近更新 更多