Что такое преобразователь монады в отличие от монады?

Вопрос говорит сам за себя. Я знаю, что (Scala) Монада выглядит так:

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 из файла :

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)
                  ^

Эээ, нет.

Прошу прощения, если все это кажется глупым, я просто пытаюсь понять, какое милое добро я упаковываю Файл => Вариант [Int] в ReaderT действительно может купить меня.

22
задан Don Stewart 24 April 2011 в 17:17
поделиться