【问题标题】:What is the derivation that shows Haskell's \x -> (x, x) equivalent to join (,)?显示 Haskell 的 \x -> (x, x) 等价于 join (,) 的推导是什么?
【发布时间】:2015-06-16 18:46:42
【问题描述】:

根据pointfree

\x -> (x, x)

相当于:

join (,)

说明这一点的推导是什么?

【问题讨论】:

    标签: haskell pointfree


    【解决方案1】:

    查看类型签名:

    \x -> (x, x) :: a -> (a, a)
    
    (,)          :: a -> b -> (a, b)
    
    join         :: Monad m => m (m a) -> m a
    

    需要注意的是((->) r)Monad 类型类的一个实例。因此,关于专业化:

    join         :: (r -> r -> a) -> (r -> a)
    

    join 对函数的作用是将给定函数两次应用于同一个参数:

    join f x = f x x
    
    -- or
    
    join f = \x -> f x x
    

    由此,我们可以粗略地看出:

    join (,) = \x -> (,) x x
    
    -- or
    
    join (,) = \x -> (x, x)
    

    Qed。

    【讨论】:

      【解决方案2】:

      我喜欢 Aadits 直观的答案。这是我通过阅读源代码来解决的方法。

      1. 我去Hoogle
      2. 我搜索join
      3. click on join
      4. 我点击“来源”按钮进入the source code for join
      5. 我看到join x = x >>= id
      6. 所以我知道join (,) = (,) >>= id
      7. search for >>= on Hoogle and click the link
      8. 我看到它是 monad 类型类的一部分,我知道我正在处理 (,) 这是一个函数,所以我 click "source" on the Monad ((->) r) instance
      9. 我看到f >>= k = \r -> k (f r) r
      10. 因为我们有f = (,)k = id,所以我们得到\r -> id ((,) r) r
      11. 太好了……新功能! id!我在 Hoogle 上搜索,click through to its source code
      12. 原来是id x = x
      13. 所以我们现在有\r -> ((,) r) r 而不是join (,)
      14. \r -> (,) r r是一样的
      15. \r -> (r,r)是一样的

      永远不要忘记 Haddocks 链接到库的源代码。这在试图弄清楚事物如何协同工作时非常有用。

      【讨论】:

      • 这对初学者来说很漂亮。写出这样的答案对新手来说非常有用。
      猜你喜欢
      • 1970-01-01
      • 2016-07-07
      • 2021-09-21
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多