【发布时间】:2017-12-06 00:29:48
【问题描述】:
我正在尝试编写一个程序,该程序将Arbitrary 实例生成的数据列表写入文件,但我在组合Arbitrary 和IO monad 时遇到了麻烦。
我正在尝试做的简化版本如下所示。
main = do
let n = 10
list <- vector n
writeFile "output.txt" (unlines $ show <$> list)
这会导致类型错误,因为 writeFile 的 IO monad 与 vector 的 Gen monad 不匹配。
TestCases.hs:31:3: error:
• Couldn't match type ‘IO’ with ‘Test.QuickCheck.Gen.Gen’
Expected type: Test.QuickCheck.Gen.Gen ()
Actual type: IO ()
• In a stmt of a 'do' block:
writeFile "output.txt" (unlines $ show <$> list)
In the expression:
do { let n = 10;
list <- vector n;
writeFile "output.txt" (unlines $ show <$> list) }
In an equation for ‘main’:
main
= do { let n = ...;
list <- vector n;
writeFile "output.txt" (unlines $ show <$> list) }
我曾尝试使用liftIO 来解决这种类型不匹配的问题,但由于Gen 缺少MonadIO 实例,这似乎不起作用。
main = do
let n = 10
list <- vector n :: Gen [Integer]
liftIO $ writeFile "output.txt" (unlines $ show <$> list)
给出错误
TestCases.hs:32:3: error:
• No instance for (MonadIO Gen) arising from a use of ‘liftIO’
• In a stmt of a 'do' block:
liftIO $ writeFile "output.txt" (unlines $ show <$> list)
In the expression:
do { let n = 10;
list <- vector n :: Gen [Integer];
liftIO $ writeFile "output.txt" (unlines $ show <$> list) }
In an equation for ‘main’:
main
= do { let n = ...;
list <- vector n :: Gen [Integer];
liftIO $ writeFile "output.txt" (unlines $ show <$> list) }
如何将任意生成的列表打印到文件中?
【问题讨论】:
标签: haskell monads quickcheck