当我在Haskell中编译下面的代码时,我收到以下错误:
错误:解析输入' gr'在第x行
module Main where
import PGF
import System.Environment
import System.IO
main :: IO ()
main = do
file:_ <- getArgs
gr <- readPGF file
content <- readFile "input.txt"
writeFile "output.txt" &(translate gr content)
translate :: PGF -> String -> String
translate gr s = case parseAllLang gr (startCat gr) s of
(lg,t:_):_ -> unlines [linearize gr l t | l <- languages gr, l /= lg]
_ -> "NO PARSE"
在这段代码中,我想从输入文件中读取一行(字符串)并将其绑定到内容。之后将内容和PGF文件(gr)传递给翻译函数,最后通过输出文件上的translate函数编写处理后的字符串。
此代码有什么问题,我该如何解决?
答案 0 :(得分:2)
不要缩进translate
的定义。它应该直接排在其类型签名之下。
translate :: PGF -> String -> String
translate gr s = {- ... -}
缩进main
的正文。 do
之后的行需要缩进,否则布局规则将指示其后面的所有内容都是do
块的一部分。
我认为你是从另一种语言借用&
。您应该将该行写为
writeFile "output.txt" (translate gr content)
或
writeFile "output.txt" $ translate gr content
(它们是相同的;在Haskell中使用运算符$
来消除对括号的需要。)