这个问题说明了一切,真的。我知道(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]
}
Monad Transformer是什么样的?它们是用来做什么的?
编辑。考虑以下 REPL 会话:如果 monad 转换器以某种方式装饰具有读取器功能的 monad(反之亦然)
假设我只想使用replicateM
from 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
从 a 中读取一个值,而不是拥有a File
:
scala> val f = (_ : java.io.File) => some(1)
f: (java.io.File) => Option[Int] = <function1>
所以,我可以把这个读者当作一个 Monad 来对待吗?
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
实际上能给我带来什么好处。