如何在Scala中使用Reader和Writer monad?

时间:2013-12-28 17:41:46

标签: scala io functional-programming monads

假设我正在编写一个程序,它读取一些输入,处理它并写入输出。

假设我还有一个函数def process(input: MyInput): MyOutput

现在我应该使用Reader monad作为输入。

def readAndProcess(reader: MyReader[MyInput]): MyReader[MyOutput] = 
  for(in <- reader) yield process(in)

到目前为止,这么好,但现在我需要在某处写输出。也就是说,我需要Writer monad并且可以定义函数readProcessAndWrite

def readProcessAndWrite(reader: MyReader[MyInput]): MyWriter[MyOutput]

假设我有一个功能

def write(out: MyOutput, writer: MyWriter[MyOutput]) : MyWriter[MyOutput]

如何定义readProcessAndWrite

def readProcessAndWrite(reader: MyReader[MyInput], 
                        writer: MyWriter[MyOutput]): MyWriter[MyOutput] = ... ???

1 个答案:

答案 0 :(得分:5)

我想你有点误解了。 Reader monad不是用于读取程序的输入,而是为了避免将相同的参数传递给各种函数。类似地,Writer关于在计算上累积一些状态,而不是将其写入(例如)标准输出或文件。 (当然,你可以在积累之后写出来,但你不会使用Writer monad!)

如果您真的想要将它们组合在一起,则需要编写组合monad(ReaderWriter[MyInput, MyOutput];请参阅this question)或monad transformersReaderT[MyInput, Writer[MyOutput]]或反之亦然)。