根据 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)
证毕。
join
的相关信息join
join
的源代码join x = x >>= id
join (,) = (,) >>= id
>>=
并点击链接(,)
,所以我 点击 Monad ((->) r)
实例上的 "源代码" 按钮f >>= k = \r -> k (f r) r
f = (,)
和 k = id
,所以我们得到 \r -> id ((,) r) r
id
!我在 Hoogle 上搜索它,然后 点击进入其源代码id x = x
\r -> ((,) r) r
,而不是 join (,)
\r -> (,) r r
相同\r -> (r,r)
相同