Вопрос говорит сам за себя, правда. Я знаю, что (Scala) Monad выглядит так:
trait Monad[M[_]] {
def pure[A](a : A) : M[A]
def bind[A, B](ma : M[A], f : A => M[B]) : M[B]
}
Как выглядит Монада Трансформер ? И для чего они используются?
<ч />
EDIT . Рассмотрим следующий сеанс REPL: если преобразователь монад каким-то образом украшает монаду с возможностями считывателя (или наоборот)
Допустим, я просто хочу использовать replicateM
из Scalaz ;
scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._
scala> some(4).replicateM[List](2)
res20: Option[List[Int]] = Some(List(4, 4))
Теперь, скажем, вместо Option[Int]
мне нужно прочитать значение Int
из File
:
scala> val f = (_ : java.io.File) => some(1)
f: (java.io.File) => Option[Int] = <function1>
Итак, я могу относиться к этому читателю , как к монаде?
scala> ReaderT(f).replicateM[List](2)
<console>:16: error: value replicateM is not a member of scalaz.ReaderT[Option,java.io.File,Int]
ReaderT(f).replicateM[List](2)
^
Ошибка, нет.
Извиняюсь, если все это кажется глупым, я просто пытаюсь понять, какую прекрасную доброту моя упаковка File => Option[Int]
в ReaderT
может действительно купить мне.