gpt4 book ai didi

haskell - 使用 Pipes 的简单程序挂起

转载 作者:行者123 更新时间:2023-12-04 11:26:12 25 4
gpt4 key购买 nike

我有以下程序,使用 runhaskell Toy.hs 运行时不产生任何输出,而是无限期挂起。据我了解,程序应该打印“hi”然后退出。我将不胜感激有关如何调试此类问题的答案和/或建议。我正在使用来自 github ( github.com/Gabriel439/Haskell-Pipes-Library ) 的 Pipes 4.0.0。

module Toy where

import Pipes
import Control.Monad.State

type Request = String
type Response = String

serveChoice :: Request -> Server Request Response IO ()
serveChoice = forever go
where go req = do
lift $ putStrLn req
respond req

run :: Monad m => () -> Client Request Response (StateT Int m) ()
run () = do
request "hi"
return ()

main :: IO ()
main = evalStateT (runEffect $ hoist lift . serveChoice >-> run $ ()) 0

最佳答案

您需要使用 foreverK而不是 forever , 像这样:

module Toy where

import Pipes
import Pipes.Prelude (foreverK)
import Control.Monad.State

type Request = String
type Response = String

serveChoice :: Request -> Server Request Response IO ()
serveChoice = foreverK go
where go req = do
lift $ putStrLn req
respond req

run :: Monad m => () -> Client Request Response (StateT Int m) ()
run () = do
request "hi"
return ()

main :: IO ()
main = evalStateT (runEffect $ hoist lift . serveChoice >-> run $ ()) 0

您的原始版本挂起的原因是您使用了 foreverReader monad(即 ((->) a) monad)而不是管道 monad。在这个单子(monad)中, forever相当于 :
-- i.e.        m b  ->     m c
forever :: (a -> b) -> (a -> c)
forever m = m >> forever m
= m >>= \_ -> forever m
= \a -> (\_ -> forever m) (m a) a
= \a -> forever m a
= forever m
foreverK可能是您想要的,因为它与 Server 的习语相同s 在 pipes-3.3.0 中介绍教程。

此更改修复了现在正常完成的程序:
>>> main
hi
>>>

关于haskell - 使用 Pipes 的简单程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17386128/

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