首先我是新来的,感谢您的帮助。
问题基本上是我无法通过在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 }
任何人都知道如何解决这个问题? 提前谢谢!
答案 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