current version of the Pipes tutorial的,使用以下两个功能中的示例中的一个:我如何摆脱Haskell中的循环?
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
如教程本身mentinoed,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)
}
'whileM_'似乎也做了同样的事情,只是参数的“常规”顺序。那就是我正在寻找的东西。 – hugomg
从某种意义上说,'whileM_'的参数顺序更自然。然而,这需要测试的倒置,我认为“做一些事情,直到EOF”比“当(而不是EOF)做某事时更自然”。个人喜好。 –
我也只是注意到,直到M_检查循环体后的条件。这将有不同于orifinal代码的行为。 – hugomg