【问题标题】:How to use Reader and Writer monads in Scala?如何在 Scala 中使用 Reader 和 Writer monad?
【发布时间】:2014-01-16 00:48:41
【问题描述】:

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

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

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

def readAndProcess(reader: MyReader[MyInput]): MyReader[MyOutput] =
  for(in 

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

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

假设我有一个函数

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

如何定义readProcessAndWrite

def readProcessAndWrite(阅读器:MyReader[MyInput], 作家:MyWriter[MyOutput]):MyWriter[MyOutput] = ... ???

【问题讨论】:

    标签: scala io functional-programming monads


    【解决方案1】:

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

    如果你真的想组合它们,你需要编写一个组合的 monad(ReaderWriter[MyInput, MyOutput];参见this question)或monad transformersReaderT[MyInput, Writer[MyOutput]],反之亦然)。

    【讨论】:

    • 谢谢。我会更新我的问题。现在我想知道如何编写你提到的组合单子和变压器。可以举个例子吗?
    • 我添加了一些可能有用的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多