【问题标题】:My program seems to be running infinitely, and I'm not sure where it is failing to continue我的程序似乎无限运行,我不确定它在哪里无法继续
【发布时间】:2017-09-13 14:46:49
【问题描述】:

我一直致力于使用 I/O 在 Haskell 中写入文件,但它只是坐在那里运行,没有最终产品。

main :: IO ()
main = do
  hawkID <- getLine
  let text = "module Operations where\nimport " ++ hawkID ++ "\n\nsample :: (" ++ hawkID ++ "a)\nsample = B\n\
                                                                                        \size :: (" ++ hawkID ++ " a) -> Int\nsize x = 0\n\n\
                                                                                        \depth :: (" ++ hawkID ++ " a) -> Int\ndepth x = 0\n\n\
                                                                                        \dropN :: (" ++ hawkID ++ " a) -> (" ++hawkID ++ " a)\ndropN x = x\n\n\
                                                                                        \countB :: (" ++ hawkID ++ " a) -> Int\ncountB x = 0\n\
                                                                                        \ltoB :: (" ++ hawkID ++ " a) -> (" ++ hawkID ++ " b)\nltoB x = B\n\n\
                                                                                        \toString :: (" ++ hawkID ++ " a) -> String\ntoString x = \"\"\n\n\
                                                                                        \mapHawkid :: (a -> b) -> (" ++ hawkID++ " a) -> (" ++ hawkID ++ " b)\n\n\
                                                                                        \substB :: (" ++ hawkID ++ " a) -> (" ++ hawkID ++" a) -> (" ++ hawkID ++ " a)\n\
                                                                                        \substB x y = B"
  let file =  writeFile "Desktop/hawkID.hs"  text

  return ()

【问题讨论】:

  • 它只是在等你在标准输入中输入一个hawkID...输入一个id然后回车。

标签: haskell io ghci


【解决方案1】:

您是否正在输入文本并按 Enter 来满足 getLine 调用?不会有提示。如果您需要提示,我认为您需要(例如)putStr 并且可能需要禁用输出缓冲。

此外,您的 writeFile 调用不会被评估 - 您需要将它放在 do 块的主体中​​,例如:

import System.IO

main :: IO ()
main = do
  hSetBuffering stdout NoBuffering
  putStr "Hawk ID: "
  hawkID <- getLine
  let text = ...
  writeFile "hawkID.hs" text

【讨论】:

  • 啊,我没想到它会像 :main Biehl 一样读起来。谢谢!
  • @hawkeye Ah no getLine 从标准输入读取一行。对于命令行参数,您将使用来自System.EnvironmentgetArgs。当然,我认为您可以通过管道输入而不是直接输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多