【问题标题】:Haskell newline, how?Haskell换行符,怎么样?
【发布时间】:2016-04-22 13:39:08
【问题描述】:

下面的代码有问题。它应该是一种字典,首先询问德语单词,而不是巴伐利亚单词并将两者保存在 .txt 文件中。然后 newLine 用于下一对。当您停止输入新单词时程序终止。更新: 新行“/n”不起作用。我该如何解决?

 main :: IO ()
 main = do
  putStrLn "Deutsches Wort: "
  deutsch <-getLine
   if  deutsch  /= []
    then do
    putStrLn "Bayerisches Wort: "
    bayerisch <- getLine
    appendFile "woerterbuch.txt" (deutsch++ " "++ bayerisch++ " /n")
    putStrLn (deutsch ++ " ist auf bayerisch " ++ bayerisch)
    main
  else return()

【问题讨论】:

  • 服务毛里求斯。你的缩进是……混合的。您能否确保该代码与您系统上的代码实际匹配?此外,writeFile 总是 会截断文件。另外,bayerisch/n 不应该工作。
  • 更改了缩进。所以很明显我误解了 writeFile 函数。如何更改我的程序以将一对 2 单词保存到 .txt 文件并在该换行符之后?
  • 你的isNotEmpty函数可以简化。你基本上是在做if condition then True else False
  • 你试过"\n"而不是"/n"吗?

标签: haskell dictionary io functional-programming ghc


【解决方案1】:

我会这样做。

import System.IO
import System.Environment
import Control.Monad

main :: IO ()
main = do
  (fileName:_) <- getArgs
  unless (null fileName) $ 
    withFile fileName WriteMode makeDictionary
  where    
    makeDictionary :: Handle -> IO()
    makeDictionary h = do
      putStrLn "Deutsches Wort: "
      deutsch <-getLine
      if not . null $ deutsch
        then do
          hPutStr h $ deutsch++" "
          putStrLn "Bayerisches Wort: "
          bayerisch <- getLine
          hPutStrLn h bayerisch
          putStrLn (deutsch ++ " ist auf bayerisch " ++ bayerisch)
          makeDictionary h
        else return()

您的修订版本看起来应该可以工作,但这里的优点是文件不会被重复打开和关闭。虽然我不确定 GHC 是否足够聪明,可以在您的情况下保持打开状态。此外,通常最好检查带有 null 的空字符串,而不是与空列表进行比较。

根据 chepner 的评论进行编辑。

【讨论】:

  • 感谢那个版本!您是否还知道当您在 shell 中运行它时,我如何将它作为参数保存在其中的文件?我尝试使用 args
  • 已编辑以接受文件名。但请注意,如果没有传递任何参数,这将崩溃,但会忽略第一个参数之后的任何参数。
  • 我会在将deutsch 写入文件之前检查它是否为空。
猜你喜欢
  • 2011-07-22
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 2011-08-22
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多