Haskell:“脱糖状态”表示法

时间:2019-02-07 16:26:09

标签: haskell

我有一个精心设计的函数,可以帮助您使用State计算斐波那契数列。

fbs :: Int -> State (Int,Int) Int
fbs = \_ -> do
  (a,b) <- get
  put (b,a+b)
  (a,_) <- get
  pure a

当我使用do表示法编写它时,它会编译,但是我不能对其进行解糖:

fbs' :: Int -> State (Int, Int) Int
fbs' = \_ -> get >>= (\(a,b) ->
  put (b,a+b) *>
    get (\(a,_) ->
      pure a )) 

 * Ambiguous type variable `f0' arising from a use of `pure'

我在做什么错了?

1 个答案:

答案 0 :(得分:4)

粗略地讲,每条do行都对应于>>=(或其某些更简单的形式,如>>)。

您的情况是:

fbs = \_ -> 
  get >>= ( \ (a,b) ->
     put (b,a+b) >>
        get >>= ( \ (a,_) ->
           pure a ))

为清楚起见,我添加了一些多余的括号和缩进。

您的原始代码在第二个>>=之后缺少get