gpt4 book ai didi

scala - 与 monad 不同的 monad-transformer 是什么?

转载 作者:行者123 更新时间:2023-12-01 16:30:20 25 4
gpt4 key购买 nike

这个问题确实说明了一切。我知道(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 session :如果 monad 转换器以某种方式用读取器功能装饰 monad(反之亦然)

假设我只想使用 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)

即,由 StateIO monad 组成的 Reader

  • Reader 可以访问只读内存
  • State 提供一种读写状态的形式
  • IO 允许任意外部效果

请注意,monad 变换是更高级别的类型。它们采用一元类型 (* -> *),并生成该类型的新类型。

一如既往,Haskell wiki 有一些有用的内容:

一切开始的地方:

关于scala - 与 monad 不同的 monad-transformer 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5066249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com