我试图在Haskell中编写类似于repl的代码,并希望在C中复制这段代码:
for (int c = getc(stdin); c != 'e'; c = getc(stdin)) {
printf("I got %c!\n", c);
}
我可以使用递归,但我害怕增加限制。
发布于 2022-03-02 10:58:43
你应该使用递归。Haskell被设计成不受限制地处理递归,即使是有效的无限循环(例如,事件处理循环或REPL循环),也可以而且应该使用递归。
因此,您可以大致按照以下方式编写您的程序:
main = do
txt <- getLine
if txt /= "exit" then do
putStrLn $ "I got " ++ txt ++ "!"
main
else do
return ()
给予:
$ ./repl
foo
I got foo!
bar
I got bar!
exit
$
我编写它是为了抓取整行输入,而不是单个字符,因为当尝试逐字符获取输入时,通常会出现缓冲输入的问题。这种无限递归工作得很好,无论它在退出前处理了多少行,都不会超过任何限制。
在大多数真实世界的程序中,您不希望整个主程序循环,所以通常编写如下所示。在这里,我使用了when
,这是编写模式if xxx then yyy else return ()
的一种更好的方式。
import Control.Monad -- for definition of "when"
main = do
-- initialization
putStrLn $ "Welcome to my REPL!"
-- start the main loop
loop
-- clean up
putStrLn $ "Thanks so much for using my REPL!"
-- definition of main loop
loop = do
txt <- getLine
when (txt /= "exit") $ do
putStrLn $ "I got " ++ txt ++ "!"
loop
https://stackoverflow.com/questions/71325716
复制