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