使用liftM时,IO Char数组不能代替String



我有一个函数,我想打印出它的值。它不是纯粹的,因为它使用了一些随机函数的值,我已经确定它们可以正确工作。我的代码是

getWord :: [IO Char]
getWord = getRandomConsonant:getRandomVowel:getRandomConsonant:getRandomConsonant: getRandomVowel:[]
main = do
    liftM putStrLn getWord

我的印象是liftM允许putStrLn打印getWord的值,但它失败了,错误:

word.hs:30:24:
    Couldn't match type `IO Char' with `[Char]'
    Expected type: [String]
      Actual type: [IO Char]
    In the second argument of `liftM', namely `getWord'
    In a stmt of a 'do' block: liftM putStrLn getWord
    In the expression: do { liftM putStrLn getWord }

由于这不起作用,是否有任何方法可以打印或执行[IO Char] ?

我明白IO对象必须"执行"才能从中获得值,但我无法想出一种方法来做到这一点。如果这里有明显的误解,请原谅,因为我昨天才开始学习Haskell。

小心:[IO Char]不是 IO [Char]

如果您有IO [Char]类型的内容,如return "hi",您可以:

(return "hi") >>= print

但是因为你的类型是[IO Char],它是IO Char的列表,你必须这样做:

sequence [(return 'h'), (return 'i')] >>= print

最新更新