下面是如何强制它编译:
case class Writer(x: Double, log: String = " Beginning of log") {
def flatMap(f: Double => Writer): Writer = f(x) match {
case Writer(fx, msg) => Writer(fx, log + "\n " + msg)
}
def map(f: Double => Double): Writer = Writer(f(x), log)
}
def outer(x: Double) = Writer(Math.log(x), s"Called outer($x)")
def inner(x: Double) = Writer(Math.exp(x), s"Called inner($x)")
def example(x: Double): Unit = {
val result = Writer(x).flatMap {
y1 => inner(y1).flatMap { y2 => outer(y2) }
}
println(result)
val result3 = for {
y1 <- Writer(x)
y2 <- inner(y1)
y3 <- outer(y2)
} yield y3
println(result3)
}
example(42)
Writer(42.0, Beginning of log
Called inner(42.0)
Called outer(1.73927494152050099E18))
Writer(42.0, Beginning of log
Called inner(42.0)
Called outer(1.73927494152050099E18))
正如在评论中已经提到的,这个整体结构不是一个单子,而是类似于“函数的幺半群中的函数组合”
Double
-测井的自同态。没有办法让你的第二个例子起作用(因为
Writer
不是一个
双倍
,但是你的
map
只需要
Double => Double
),所以我把它去掉了。