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

标签 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] = ... ???

最佳答案

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

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

关于scala - 如何在 Scala 中使用 Reader 和 Writer monad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20817434/

相关文章:

math - 最大 : like argmax but gives the position(s) of the element x for which f[x] is maximal

scala - SSLException :Unrecognized SSL message, 明文连接

scala - 不同版本之间的 Akka 远程处理

io - 如何让lua按顺序运行

c - 中间命令行界面

haskell - 如果我知道(或合理预期)IO 操作是引用透明的,我可以对其使用 unsafePerformIO 吗?或者还有其他条件吗?

scala - 在嵌套 for 循环中 if 后的产量

scala - Future 不是 scala.concurrent 的成员

scala - Apache Spark - 注册 UDF - 返回数据帧

ruby - 用 Ruby 折叠和柯里化(Currying)