我正在尝试让Haskell从文件中选择一个随机行并打印出来。我的尝试如下:
import Data.Random.Extras (choice)
main :: IO ()
main = do
filecontents <- readFile "wordlist.txt"
let words = lines filecontents
let word = choice $ words
word >>= putStrLn
最后一行是发生错误的地方。 >>=
需要IO String
,但word
为Data.RVar.RVar String
。 (该变量称为“word”,因为每行应该是一个单词。)
我已经阅读了RVar的文档,但经过一些黑客攻击后,我看不出如何解决我的问题。有什么想法吗?
我在安装Haskell平台OS X 10.9时使用ghc 7.6.3。
完整错误如下:
[ 01:46 PM (51) integral:thoth ~/Source/pwgen ] > ghc -o pwgen pwgen.hs
[1 of 1] Compiling Main ( pwgen.hs, pwgen.o )
pwgen.hs:40:3:
Couldn't match type `Data.RVar.RVarT
Data.Functor.Identity.Identity'
with `IO'
Expected type: IO String
Actual type: Data.RVar.RVar String
In the first argument of `(>>=)', namely `word'
In a stmt of a 'do' block: word >>= putStrLn
In the expression:
do { filecontents <- readFile "wordlist.txt";
let words = lines filecontents;
let word = choice $ words;
word >>= putStrLn }
最后,我知道有更有效的方法从文件中选择随机行。我只是为了最低限度的工作。我也是Haskell的初学者,可能有一些基本的误解,特别是关于IO和monads。
答案 0 :(得分:9)
您可以使用
import Data.Random
然后修改main
main = do
...
let word = sample $ choice words
putStrLn =<< word
这是有效的,因为当您导入Data.Random
时,它包含MonadRandom
IO
的实例,并为sample
提供runRVar
的方便包装从IO monad获得的生成器。