Смешивание монад в Haskell

Я пытаюсь работать с Ubigraph в haskell, но считаю, что моя проблема более общая. Я пытаюсь скомпилировать:

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 ()

и получаю

 Не удалось сопоставить ожидаемый тип `Control.Monad.Trans.Reader.ReaderT
 Убиграф IO a0 '
 с фактическим типом ʻIO () '
В возвращаемом типе вызова `putStrLn '
В stmt выражения 'do': putStrLn "что-то"
В выражении:
 делать {ясно;
 vs <- mapM (const newVertex) [0 .. 200];
 mapM_ (setVAttr (VShape Sphere)) vs;
 putStrLn "что-то";
 ....}

Я вижу, что тип операции подразумевается как нечто отличное от типа возвращаемого значения putStrLn, но я не уверен, как бы я переделал этот код для правильной компиляции. Могу ли я просто изменить тип возвращаемого значения функции op?

Спасибо

10
задан Don Stewart 27 April 2011 в 15:43
поделиться