Чтобы научиться создавать монады и изучить их внутренние механизмы, я пытаюсь реализовать версию Writer, следуя этой замечательной статье: Вы могли бы изобрести монады!
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу использовать структуры данных, которые я создал для понимания.
Это очищенный фрагмент моего кода:
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 ): Double = f( x )
}
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 = {
// This works
val result = Writer( x ).flatMap {
y1 => inner(y1).flatMap { y2 => outer(y2) }
}
println( result )
// This works
val result2 = for { y1 <- Writer(x) } yield {
for { y2 <- inner( y1 ) } yield {
for { y3 <- outer( y2 ) } yield y3
}
}
println( result2 )
// THIS DOESN'T WORK
val result3 = for {
y1 <- Writer(x)
y2 <- inner( y1 )
y3 <- outer( y2 )
} yield y3 // Or whatever, it doesn't work
println( result3 )
}
Мой полный код доступен здесь: Debuggable.scala
- Я понимаю, как осмысливается понимание, моя проблема не в этом.
- Я прочитал несколько учебных пособий, в том числе: Писатель? Я едва знал ее!
- Я попытался понять пример того, как Writer проверяет скаляр: GitHub scalaz WriterT но слишком много шума для меня
Что я не могу понять, так это , чего не хватает в моем коде .
Это похоже на то, как реализация скалаза возвращает что-то хорошее для понимания, а затем вы запускаете это с помощью специального метода. Но не могу найти, как это сделать сам