我有一个精心设计的函数,可以帮助您使用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'
我在做什么错了?
答案 0 :(得分:4)
粗略地讲,每条do
行都对应于>>=
(或其某些更简单的形式,如>>
)。
您的情况是:
fbs = \_ ->
get >>= ( \ (a,b) ->
put (b,a+b) >>
get >>= ( \ (a,_) ->
pure a ))
为清楚起见,我添加了一些多余的括号和缩进。
您的原始代码在第二个>>=
之后缺少get
。