我正在尝试使用haskell中的Ubigraph,但我相信我的问题更通用。我正在努力编译:
import Graphics.Ubigraph
import Control.Monad
import System.Posix.Unistd
main = do
h <- initHubigraph "http://127.0.0.1:20738/RPC2"
runHubigraph op h
op = do
clear
vs <- mapM (const newVertex) [0..200]
mapM_ (setVAttr (VShape Sphere)) vs
putStrLn "something"
let bind i = zipWithM (\a b -> newEdge (a,b)) vs (drop i vs ++ take i vs)
mapM_ bind [1..15]
mapM_ (removeVertex) vs
return ()
我正在
Couldn't match expected type `Control.Monad.Trans.Reader.ReaderT Ubigraph IO a0' with actual type `IO ()' In the return type of a call of `putStrLn' In a stmt of a 'do' expression: putStrLn "something" In the expression: do { clear; vs <- mapM (const newVertex) [0 .. 200]; mapM_ (setVAttr (VShape Sphere)) vs; putStrLn "something"; .... }
我可以看到op的类型与putStrLn的返回类型有什么不同,但我不确定如何重新编译这段代码以便正确编译。我可以简单地更改op函数的返回类型吗?
由于
答案 0 :(得分:12)
putStrLn
op
中埋葬的IO
号召唤号位于Ubigraph
monad。您需要使用
liftIO $ putStrLn "foo"
monad
Ubigraph
这样的提升功能可以帮助您访问堆栈中较低的monadic函数。在这种情况下,liftIO
是由IO monad组成的Reader monad,IO monad位于底部。所以必须解除IO中的事情。
MonadIO
来自{{1}}班,in the transformers package。