【发布时间】:2015-03-16 06:27:15
【问题描述】:
我正在编写一个 Haskell 程序。以后有更高级的功能,但现在我被困在阅读文件上。我知道有很多关于它的线程,但据我所知,所有解决方案都是基于循环的。我需要从 3 行的 txt 文件中读取。并将这 3 行的内容保存在 3 个单独的变量中以供进一步使用,因此基于循环的解决方案不仅没有必要而且有问题(保存到 3 个不同的变量中)。我搜索了一下,找到了一些示例,尝试从中构建一些东西,但是这种语言看起来很奇怪,我不明白为什么有些修改有效而有些修改无效。
首先,工作代码:
import System.IO
main :: IO ()
main = do
inh <- openFile "input.txt" ReadMode
outh <- openFile "output.txt" WriteMode
mainloop inh outh
hClose inh
hClose outh
mainloop :: Handle -> Handle -> IO ()
mainloop inh outh = do
inp1 <- hGetLine inh
inp2 <- hGetLine inh
inp3 <- hGetLine inh
putStrLn (inp3)
这段代码首先从文件中读取第二行,然后是第三行,将每行保存到各自的变量中,然后将 inp3 放在屏幕上。问题是,我不需要打印它,只需将它保存到 3 个变量中以供进一步使用,但是如果没有打印行,程序将无法工作,编译器会说“do 块中的最后一条语句必须是一个表达式”。但是,如果我想打印更多行以查看读取是否正常工作并添加更多 putStrLn(用于 inp1 和 inp2),它将无法编译。例如,在获取 inp1 的行之后添加行“putStrLn (inp1)”后,它不会编译并说“在模式 putStrLn 中解析错误,可能是由于缺少'do'引起的?我只是开始使用 Haskell 所以这可能很明显,但我不知道是什么。
还有第二个问题。该程序从 input.txt 中读取。我希望它询问姓名,等待人输入然后打开它。我想它会是这样的
putStrLn "Type name"
name <- getLine
inh <- openFile name ReadMode
但它也不起作用。我将非常感谢任何可以帮助我的意见。奇怪的是,在http://en.wikibooks.org/wiki/Haskell/Libraries/Solutions/IO 中给出的示例中 正在使用类似的东西,它编译没有任何问题,但我的不会。有什么建议吗?
【问题讨论】:
-
你为什么不返回你的台词呢?例如。
mainloop :: Handle -> Handle -> IO (String,String,String) ; .... ; inp3 <- hGetLine inh ; return (inp1,inp2,inp3). -
因为我很笨,对 Haskell 了解不够。 ;) 非常感谢,关于输入文件名的任何想法?
-
你不应该试图在第二个问题上硬生生,这只是切线相关的。只需创建一个实际的新问题。另外,
mainLoop inh = liftA3 (,,) a a a where a = hGetLine inh. -
好的,抱歉。反正我自己解决了。似乎notepad ++使白色符号有些混乱,并且haskell编译器一个接一个地显示愚蠢的错误。在常规记事本中编辑后,名称问题已解决..