4

我需要组合一个消费者和一个管道,以便消费者的输出可以输入管道的输入。

我想这可以用这样的组合器来解决:

Consumer i m r -> (r -> Producer o m r') -> Pipe i o m r'

或这个:

Consumer i m i' -> Pipe i' o m r -> Pipe i o m r

或类似以下的提升功能:

Consumer i m r -> Pipe i o m r

或像这样:

Consumer i m o -> Pipe i o m r

我试过consumer >~ pipe没有成功。那么如何处理呢?

4

2 回答 2

5

对于您的第一个类型签名,如果您的ConsumerandProducer使用多态类型同义词Consumer'and Producer',那么您想要的组合子是(>>=)

(>>=) :: Pipe i o m r -> (r -> Pipe i o m r') -> Pipe i o m r'

AConsumer' i m r将类型检查为Pipe i o m r. 同样, aProducer' o m r'将类型检查为 a Pipe i o m r'

于 2014-07-14T21:13:27.253 回答
4

类似于您的签名的Consumer i m o -> Pipe i o m r事情可以这样完成:

{-# LANGUAGE RankNTypes #-}
import Pipes

foo :: Monad m => Consumer' i m o -> Pipe i o m ()
foo consumer = consumer >>= yield

我使用了Consumer'多态类型的同义词,因为它不是真正封闭的“下游”,它可以用作Pipe实际从不yields 的 a。为了让它产生消费者的返回值,我们简单地使用一元绑定。

至于您的Consumer i m r -> Pipe i o m r签名,它只是使用多态类型同义词的身份:

iden :: Monad m => Consumer' i m r -> Pipe i o m r
iden consumer = consumer
于 2014-07-14T18:54:29.707 回答