2

假设我想从 jms 读取数据,将其映射toUpperCase并发送到其他地方。所以我用 抽象出实际的消息系统Jms[A],对吧?

 trait Jms[A]    
 case object Pull extends Jms[String]    
 case class Push(s: String) extends Jms[Unit]

业务逻辑:

  def freeProcess(source: Stream[Jms, String], sink: Sink[Jms, String]): Free[Jms, Unit] =
    source.map(_.toUpperCase).through(sink).runFree

Free是要被解释的,就这样吧:

 val interpreter = new ~>[Jms, Task] {
    def apply[A](f: Jms[A]): Task[A] = f match {
      case Pull => Task.now {
        /* await on socket;  toString */
        "incoming"
      }
      case Push(m: String) => Task.now {
        /* push to socket */
        ()
      }
    }
  }

但是,要传递给freeProcess? 这些/什么?实现不是在完成所有工作吗?那我就不能忘记s吗?sourcesinkinterpreterStream

怎么在这里实际使用Free

4

0 回答 0