【问题标题】:interact function waiting non-stop. Haskell [duplicate]交互功能等待不停。哈斯克尔[重复]
【发布时间】:2016-06-20 01:14:04
【问题描述】:

让我们考虑一下函数: 导入数据.Char

convertStringToInt :: String -> Int
convertStringToInt s = convertStringToInt' s 1 0
    where 
          convertStringToInt'  [] _ res    = res
          convertStringToInt' (h:t) m res = convertStringToInt' t (m*10) (res + (((ord h) - 48)*m))

f :: String -> String 
f s = (show . convertStringToInt)s

main = interact f

当我输入“1212”时,什么都不会发生。只是提示仍在等待。 为什么?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    interact 首先读取整个输入,然后打印将整个输入传递给函数的结果。除非工作函数只需要输入的初始部分,否则 Haskell 运行时需要读取直到输入结束。您的函数会消耗整个字符串,所以会发生这种情况。

    因此,在您完成输入之前(即 Unix 中的 CTRL+D),您不会得到结果。

    【讨论】:

    • 这不是真的。 interact 打印将函数应用于整个输入的结果,但是由于惰性 IO,这通常并不意味着在打印任何内容之前先读取整个输入。这个问题中的特定 f 确实如此,因为 f 在其整个输入字符串中都是严格的。
    • @ReidBarton 我不太确定是否需要使用惰性 I/O 实现 interact,或者根本需要存在惰性 I/O。因此,您所描述的是特定 haskell 实现的实现细节。
    • Haskell 报告说“getContents 操作将所有用户输入作为单个字符串返回,根据需要延迟读取”,interact 的规范是根据 @987654328 @。 (无论如何,您想到了什么特定的 Haskell 实现,其行为与您描述的一样?)
    • 没有什么特别的,@ReidBarton,但我认为惰性 I/O 是 GHC 的专长。看来我错了。
    • 我反对的主要是“先,然后”这两个词; “和”就好了。
    【解决方案2】:

    Haskell interact function 已有答案。 IO 默认是惰性的。如果您希望该函数逐行处理您的输入,您可以使用unline 函数:

    interact (unlines . map (show . length) . lines)

    带有辅助函数

    eachLine :: (String -> String) -> (String -> String)
    eachLine f = unlines . map f . lines
    

    那么你可以:

    main = interact (eachLine inputLength)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2021-08-23
      相关资源
      最近更新 更多