我正在尝试从列表中选择一个随机元素,但这将使函数不纯,因此无法编译。该如何使递归函数接受IO操作?
build :: Jabberwocky Integer String Syllables -> String
build (Jabberwocky 0 body syl) = body
build (Jabberwocky len body syl)
| syl == Middle = build (Jabberwocky (len - 1) (body ++ (rand middle) ) Consonant)
| syl == Consonant = build (Jabberwocky (len - 1) (body ++ (rand consonant)) Vowel)
| syl == Vowel = build (Jabberwocky (len - 1) (body ++ (rand vowel) ) Consonant)
| syl == Ending = build (Jabberwocky (len - 1) (body ++ (rand ending) ) Vowel)
where
rand = getStdRandom (randomR (1,6))
IO
。你只需传递自己的生成器对象,而不是使用全局对象。如果你坚持使用IO
,那么你的签名应该显示它(但我不会这样做)。 - Bartek BanachewiczJabberwocky ... -> String
是一个纯函数。你不能在其中使用IO
。你需要将该函数更改为不纯的函数 (Jabberwocky ... -> IO String
) 或停止使用全局随机数生成器。 - Bartek Banachewicz