在Haskell IO

时间:2015-12-10 19:20:40

标签: file haskell io

首先我是新来的,感谢您的帮助。

问题基本上是我无法通过在Haskell中使用writeFile写入文件。 代码:

main = do
    putStrLn "Input file: "
    ifile <- getLine
    result <- readFile ifile >>= print . emit . compile . calc . lexer
    print result

这是我目前所拥有的,我知道函数emit正在正确返回。 使用以下函数的有关函数的条件信息:

    emit :: (Int, Int, [Stuff]) -> String
    compile :: C -> (Int, Int, [Stuff])

我可以使用上面的代码打印结果,然后沿着以下行返回:

"stuff i want"
()

我发现()很有趣,但我想我可以将其从文件中删除。

当我尝试以下列方式使用writeFile时:

writeFile "file.txt" results

它给了我以下错误:

    Couldn't match type `()' with `[Char]'
    Expected type: String
      Actual type: ()
    In the second argument of `writeFile', namely `result'
    In a stmt of a 'do' block: writeFile "result.txt" result
    In the expression:
      do { putStrLn "Input file: ";
        ifile <- getLine;
        result <- readFile ifile >>= print . emit . compile . calc . lexer;
        writeFile "result.txt" result }

任何人都知道如何解决这个问题? 提前谢谢!

1 个答案:

答案 0 :(得分:1)

“有趣”()实际上是理解这一点的关键。输出()main print result的最后一行发出,因为result的类型为()

为什么呢?因为它与print . emit . compile . calc . lexer =<< readFile ifile的结果有关;或简化为print . f =<< readFile ifile的结果,用于某些纯编译器管道f。结果是print的结果,它只是()print没有返回任何有用的东西,它只是将其参数打印到stdout作为效果)。

你想要做的就是不要print任何事情,只需绑定运行编译管道的实际结果;即

之类的东西
result <- emit . compile . calc . lexer <$> readFile ifile