Ana*_*Ana 21 haskell pointfree
根据pointfree:
\x -> (x, x)
Run Code Online (Sandbox Code Playgroud)
相当于:
join (,)
Run Code Online (Sandbox Code Playgroud)
显示这个的推导是什么?
Aad*_*hah 30
看一下类型签名:
\x -> (x, x) :: a -> (a, a)
(,) :: a -> b -> (a, b)
join :: Monad m => m (m a) -> m a
Run Code Online (Sandbox Code Playgroud)
应该注意的((->) r)是,是Monad类型类的一个实例.因此,在专业化:
join :: (r -> r -> a) -> (r -> a)
Run Code Online (Sandbox Code Playgroud)
什么join做的功能是两次申请给定函数相同的说法:
join f x = f x x
-- or
join f = \x -> f x x
Run Code Online (Sandbox Code Playgroud)
从这一点来看,我们可以轻松地看到:
join (,) = \x -> (,) x x
-- or
join (,) = \x -> (x, x)
Run Code Online (Sandbox Code Playgroud)
QED.
kqr*_*kqr 24
我喜欢Aadits的直观回答.这是我通过阅读源代码来弄清楚的.
joinjoinjoinjoin x = x >>= idjoin (,) = (,) >>= id>>=上Hoogle并点击链接(,)哪个是函数,所以我在Monad ((->) r)实例上单击"source"f >>= k = \r -> k (f r) rf = (,)和k = id,我们得到\r -> id ((,) r) rid!我在Hoogle上搜索它,然后点击它的源代码id x = xjoin (,)我们现在没有\r -> ((,) r) r\r -> (,) r r\r -> (r,r)永远不要忘记Haddocks链接到库的源代码.当试图弄清楚事物如何协同工作时,这非常有用.
| 归档时间: |
|
| 查看次数: |
474 次 |
| 最近记录: |