解释Haskell monad示例

时间:2016-07-28 02:10:28

标签: haskell monads

我有这个Haskell代码,它使输入值增加了三倍。

triple :: Int -> Int
triple = do
  n <- id
  d <- (n+)
  (d+)

此代码如何工作?使用示例triple 10,如何将参数10映射/分配给idnd以获得30的返回值?

我的理解如下:

我们可以使用以下两个子功能tripletripleA来分解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。

我的解释有什么问题?

1 个答案:

答案 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>>=的定义,我们有

1。 id&gt;&gt; = f

\r -> f (id r) r = \r -> f r r = \r -> (r+) r

2。 (id&gt;&gt; = f)&gt;&gt; = f

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)+ 1030