gpt4 book ai didi

Haskell:为什么这个函数不断要求用户输入而不终止

转载 作者:行者123 更新时间:2023-12-02 17:33:59 25 4
gpt4 key购买 nike

我正在学习一些 Haskell,并且遇到了这个小程序

reverseLines :: String -> String
reverseLines input =
unlines (map reverse (lines input))

main :: IO ()
main = interact reverseLines

该程序将不断要求用户进行更多输入,并反转输入并将其打印在屏幕上。

大部分内容都很简单,但我无法理解的一件事是为什么这个函数会继续运行并要求用户提供更多输入,而如果我只是将 reverseLines 函数替换为一个函数只是返回一些字符串,但它不会发生。

该程序将在执行一次后停止:

foo input = "Stops"
main :: IO ()
main = interact foo

为什么?

最佳答案

如果你看source of interact你会看到这个:

interact f      =   do s <- getContents
putStr (f s)

看到getContents了吗?这就是魔法开始的地方 - 它将读取所有内容,直到 EOF

现在在 Haskell 中,这是lazy-IO,这可能很糟糕,但这里几乎是神奇的 - 看到字符串被延迟读取并传递给你的 reverseLines - 这是其中之一当然,只有在看到 \n 字符()时才会生成输出,因此您的程序似乎是某种 REPL。

在第二个中,您根本不消耗任何惰性字符串,因此它会尽快停止

正如我在评论中所写,您可以通过使用文件(或 echo)和终端上的管道将内容传递到程序中来玩这个:

echo "Hello World\nBye Bye" | runhaskell LazyIO.hs

或使用 CTRL-D 自行传入 EOF。

为了感受它,我会更多地使用这些函数 - 如果您使用需要首先查看完整输入的东西(尝试在没有 map 的情况下reverse)会发生什么?使用单词而不是会发生什么,...?

玩得开心!

关于Haskell:为什么这个函数不断要求用户输入而不终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36661213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com