什么是显示Haskell的\ x - >的推导。 (x,x)相当于join(,)?

时间:2015-04-18 05:45:56

标签: haskell pointfree

根据pointfree

\x -> (x, x)

相当于:

join (,)

显示这个的推导是什么?

2 个答案:

答案 0 :(得分:30)

查看类型签名:

\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。

答案 1 :(得分:24)

我喜欢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. Sooo ...新功能! id!我在Hoogle上搜索了这个,click through to its source code
  12. 原来id x = x
  13. 因此我们现在拥有join (,)
  14. 而不是\r -> ((,) r) r
  15. \r -> (,) r r
  16. 的内容相同
  17. \r -> (r,r)
  18. 的内容相同

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