scala – 什么是monad-transformer与monad不同?
这个问题说明了一切,真的。我知道(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(反之亦然) 假设我只想使用Scalaz的replicateM; scala> import scalaz._; import Scalaz._ import scalaz._ import Scalaz._ scala> some(4).replicateM[List](2) res20: Option[List[Int]] = Some(List(4,4)) 现在让我们说,我需要从文件中读取一个Int值,而不是选择[Int]。 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) ^ 呃,不。 抱歉如果这一切看起来都很愚蠢,我只是想了解我的包装文件=> ReaderT中的选项[Int]实际上可以买我。 解决方法
Monad变换器是类型函数,当应用于monad类型时,生成一个新的monad,它结合了两个组件的行为。
例如。在xmonad窗口管理器中,计算在里面运行: newtype X a = X (ReaderT XConf (StateT XState IO) a) 也就是说,一个由State和IO monad组成的Reader。 > Reader可以访问只读内存 请注意,monad变换因此是更高级别的类型。它们采用monadic类型(* – > *),并产生一种新类型。 与往常一样,Haskell wiki有一些有用的内容: > Monad transformers 一切都开始了: > Functional Programming with Overloading and Higher-Order Polymorphism (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |