Scalaz中是否有任何关于" runnable"的概念?单子? - 可以通过隐藏的副作用从中提取结果值的那个?
trait RunnableM[M[_]] {
def runM[T](m: M[T]): T
}
我需要这个来评估monadic计算并在最后退出monad。在Haskell,我们有不同的" run" monad的函数可能涉及或可能不涉及IO,所以这种类型类可能是不可能的,至少在我看来。但在Scala中可以做到。
答案 0 :(得分:3)
不是“正确的”解决方案,但scalaz的Comonad
有copoint
,可以(ab)用来实现这一点;许多标准scalaz monad已存在Comonad
个实例,你可以欺骗并定义一个例如Task
(这可能会让理论家感到愤怒;请务必将任何此类实例的范围限制在您需要的地方,并为IO发生而感到高兴,不要让它感染远程代码)。它被拉到了实例上:
def runM[T](m: M[T])(implicit cm: Comonad[M]) = m.copoint