Scalaz - runnable monad

时间:2014-12-26 12:04:40

标签: scala monads scalaz

Scalaz中是否有任何关于" runnable"的概念?单子? - 可以通过隐藏的副作用从中提取结果值的那个?

trait RunnableM[M[_]] {
  def runM[T](m: M[T]): T
}

我需要这个来评估monadic计算并在最后退出monad。在Haskell,我们有不同的" run" monad的函数可能涉及或可能不涉及IO,所以这种类型类可能是不可能的,至少在我看来。但在Scala中可以做到。

1 个答案:

答案 0 :(得分:3)

不是“正确的”解决方案,但scalaz的Comonadcopoint,可以(ab)用来实现这一点;许多标准scalaz monad已存在Comonad个实例,你可以欺骗并定义一个例如Task(这可能会让理论家感到愤怒;请务必将任何此类实例的范围限制在您需要的地方,并为IO发生而感到高兴,不要让它感染远程代码)。它被拉到了实例上:

def runM[T](m: M[T])(implicit cm: Comonad[M]) = m.copoint