我有这个Haskell代码,它使输入值增加了三倍。
triple :: Int -> Int
triple = do
n <- id
d <- (n+)
(d+)
此代码如何工作?使用示例triple 10
,如何将参数10
映射/分配给id
,n
和d
以获得30的返回值?
我的理解如下:
我们可以使用以下两个子功能triple
和tripleA
来分解tripleB
函数:
triple :: Int -> Int
triple = tripleA >>= (\d -> tripleB d)
tripleA :: Int -> Int
tripleA = id >>= (\n -> (n+))
tripleB :: Int -> Int -> Int
tripleB d = (d+)
现在我们可以看到函数tripleA
获取输入,将其分配给id
函数以返回值本身,并将其映射到函数(\n -> (n+))
以返回{{1 }}
同样,tripleB也会(10+) 10
,所以我希望结果为40,但正确的答案是30。
我的解释有什么问题?
答案 0 :(得分:2)
我们可以按如下方式重写等效的triple2函数:
triple2 = (id >>= (\n -> (n+))) >>= (\d -> (d+))
使用f = \n -> (n+)
,我们有triple2 = (id >> f) >> f
。
根据(https://hackage.haskell.org/package/base-4.9.0.0/docs/src/GHC.Base.html#line-645)>>=
的定义,我们有
\r -> f (id r) r = \r -> f r r = \r -> (r+) r
x = id >>= f = \r -> (r+) r
x r = (r+) r
x >> f = \r -> f (x r) r = f ((r+) r) r = ((r+) r)+ r
所以((10+) 10)+ 10
会30