Простая программа с использованием Pipes зависает

У меня есть следующая программа, которая не производит вывод при запуске с runhaskell Toy.hsи вместо этого висит бесконечно. Насколько я понимаю, программа должна напечатать "привет" и затем выйти. Буду признателен за ответ и / или совет о том, как отладить такую ​​проблему. Я использую Pipes 4.0.0 из github ( http://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

1 ответ

Решение

Вам нужно использовать 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

Причина, по которой ваша оригинальная версия зависла, заключается в том, что вы использовали forever в Reader монада (то есть ((->) a) монада) а не труба монада. В этой монаде 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введены в pipes-3.3.0 руководство.

Это изменение исправляет программу, которая теперь завершается нормально:

>>> main
hi
>>>
Другие вопросы по тегам