gpt4 book ai didi

haskell - 如何在 Haskell 中跳出循环?

转载 作者:行者123 更新时间:2023-12-02 01:59:27 24 4
gpt4 key购买 nike

current version of the Pipes tutorial , 在示例之一中使用以下两个函数:

 stdout :: () -> Consumer String IO r
stdout () = forever $ do
str <- request ()
lift $ putStrLn str

stdin :: () -> Producer String IO ()
stdin () = loop
where
loop = do
eof <- lift $ IO.hIsEOF IO.stdin
unless eof $ do
str <- lift getLine
respond str
loop

正如教程本身所提到的,由于需要检查输入的结尾,P.stdin 有点复杂。

有没有什么好方法可以重写 P.stdin 以不需要手动尾递归循环并使用像 P.stdout 这样的高阶控制流组合器?在命令式语言中,我会使用结构化的 while 循环或 break 语句来做同样的事情:
while(not IO.isEOF(IO.stdin) ){
str <- getLine()
respond(str)
}

forever(){
if(IO.isEOF(IO.stdin) ){ break }
str <- getLine()
respond(str)
}

最佳答案

我更喜欢以下内容:

import Control.Monad
import Control.Monad.Trans.Either

loop :: (Monad m) => EitherT e m a -> m e
loop = liftM (either id id) . runEitherT . forever

-- I'd prefer 'break', but that's in the Prelude
quit :: (Monad m) => e -> EitherT e m r
quit = left

你像这样使用它:
import Pipes
import qualified System.IO as IO

stdin :: () -> Producer String IO ()
stdin () = loop $ do
eof <- lift $ lift $ IO.hIsEOF IO.stdin
if eof
then quit ()
else do
str <- lift $ lift getLine
lift $ respond str

this blog post我在哪里解释这种技术。

我在教程中不使用它的唯一原因是我认为它对初学者不太友好。

关于haskell - 如何在 Haskell 中跳出循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17264360/

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