【发布时间】:2015-06-16 18:46:42
【问题描述】:
根据pointfree:
\x -> (x, x)
相当于:
join (,)
说明这一点的推导是什么?
【问题讨论】:
根据pointfree:
\x -> (x, x)
相当于:
join (,)
说明这一点的推导是什么?
【问题讨论】:
查看类型签名:
\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。
【讨论】:
我喜欢 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
\r -> ((,) r) r 而不是join (,)
\r -> (,) r r是一样的
\r -> (r,r)是一样的
永远不要忘记 Haddocks 链接到库的源代码。这在试图弄清楚事物如何协同工作时非常有用。
【讨论】: