我需要这个功能:
x <- newIORef "x"
y <- newIORef "y"
swapIORefs x y
readIORef x -- Outputs "y"
readIORef y -- Outputs "x"
我最好的尝试是:
swapIORefs :: IORef a -> IORef a -> IO ()
swapIORefs x y = do let xvalue = readIORef x
let yvalue = readIORef y
writeIORef x yvalue
writeIORef y xvalue
贝瑟给了我:
The last statement in a 'do' block must be an expression
let yvalue = readIORef y writeIORef x yvalue writeIORef y xvalue
|
51 | let yvalue = readIORef y
| ^^^^^^^^^^^^^^^^^^^^^^^^^...
2条答案
按热度按时间kd3sttzy1#
这似乎是工作:
readIORef
的类型为IORef a -> IO a
,而writeIORef
的类型为IORef a -> a -> IO ()
,因此为了写入值,您需要从IO
中“获取”值,您可以使用<-
绑定来完成此操作。OP中的
let
绑定会将xvalue
绑定到IO a
,而这不会对writeIORef
进行类型检查。GHCi:
z9zf31ra2#
稍微短一点,虽然只是语法上的:
这相当于@ MarkSeemann的代码,但使用了一些函数,如
>>=
和<*
,将值隐式传递给下一个引用。