簡體   English   中英

使用Pipes的簡單程序掛起

[英]Simple program using Pipes hangs

我有以下程序,當使用runhaskell Toy.hs運行時不產生輸出,而是無限期掛起。 根據我的理解,程序應該打印“hi”然后退出。 我很感激有關如何調試此類問題的答案和/或建議。 我正在使用Github的管道4.0.0( github.com/Gabriel439/Haskell-Pipes-Library )。

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

您的原始版本掛起的原因是您在Reader monad中forever使用(即((->) 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可能就是你想要的,因為它與在foreverK pipes-3.3.0教程中引入的Server的成語相同。

此更改修復了現在正常完成的程序:

>>> main
hi
>>>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM