根据pointfree
:
\x -> (x, x)
相当于:
join (,)
显示这个的推导是什么?
答案 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的直观回答。以下是我通过阅读源代码来解决这个问题的方法。
join
join
join
join x = x >>= id
join (,) = (,) >>= id
>>=
on Hoogle and click the link (,)
这是一个函数,所以我click "source" on the Monad ((->) r)
instance f >>= k = \r -> k (f r) r
f = (,)
和k = id
,我们得到\r -> id ((,) r) r
id
!我在Hoogle上搜索了这个,click through to its source code id x = x
join (,)
\r -> ((,) r) r
\r -> (,) r r
\r -> (r,r)
永远不要忘记Haddocks链接到库的源代码。在试图弄清楚事情如何协同工作时,这非常有用。