oxb*_*kes 22 monads haskell functional-programming scala scalaz
这个问题说明了一切,真的.我知道(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是什么样的?它们用于什么?
比方说,我只是想用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>
所以,我可以对待这个读者,好像它是一个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实际上可以给我买.
Monad变换器是类型函数,当应用于monad类型时,生成一个新的monad,它结合了两个组件的行为.
例如,在xmonad窗口管理器中,计算在内部运行:
newtype X a = X (ReaderT XConf (StateT XState IO) a)
也就是说,Reader由a State和IOmonad组成.
Reader 允许访问只读内存State 提供了一种读写状态IO 允许任意外部效果请注意,monad变换因此是更高级别的类型.它们采用monadic类型(* -> *),并产生一种新类型.
与往常一样,Haskell wiki有一些有用的内容:
一切都开始了:
| 归档时间: | 
 | 
| 查看次数: | 1992 次 | 
| 最近记录: |