- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 scalaz
中使用 monad 转换器.我正在尝试将 Reader 顶部的 Writer 与底层 Id
堆叠在一起。单子(monad)。为了组合它们,我使用 MonadReader
和 MonadWriter
类型类。
我设法编译并运行了以下代码示例 没有 作者(即 Reader
monad,即 ReaderT[Id.Id, String, A]
)。添加 WriterT
时到堆栈,我得到编译错误:
Gist.scala:10: could not find implicit value for parameter F: scalaz.MonadReader[Gist.R,String]
val MR = MonadReader[R, String]
^
MonadReader
的实例为我的变压器堆栈?我必须使用
ReaderWriterStateT
吗?还是有其他方法?
import scalaz.{Id, MonadListen, MonadReader, ReaderT, WriterT}
object Gist {
import scalaz.std.list._
import scalaz.syntax.monad._
type P[A] = ReaderT[Id.Id, String, A]
type R[A] = WriterT[P, List[String], A]
val MR = MonadReader[R, String]
val MW = MonadListen[R, List[String]]
def apply: R[String] = MR.ask >>= { greeting =>
MW.tell(List(s"greeting $greeting")) >>= { _ =>
MW.point(s"Hello $greeting")
}
}
}
最佳答案
我不完全确定为什么 Scalaz 不提供此实例(或类似 monad 转换器的 MonadReader
实例),但我猜答案与 WriterTInstanceN
的事实有关。已经goes past 11并添加 MonadReader
只会让事情变得更加困惑。
您可以在 Scalaz 的 GitHub 问题中四处寻找(或者甚至在 IRC channel 上询问您是否愿意接受这类事情),但我不确定答案是否那么重要。
您可以直接从 Haskell 的 mtl 移植实例。 :
instance (Monoid w, MonadReader r m) => MonadReader r (Strict.WriterT w m) where
ask = lift ask
local = Strict.mapWriterT . local
reader = lift . reader
import scalaz.{ MonadReader, MonadTrans, Monoid, WriterT }
import scalaz.syntax.monad._
implicit def monadReaderForWriterT[F[_], I, W](implicit
F: MonadReader[F, I],
W: Monoid[W]
): MonadReader[WriterT[F, W, ?], I] = new MonadReader[WriterT[F, W, ?], I] {
def ask: WriterT[F, W, I] = MonadTrans[WriterT[?[_], W, ?]].liftM(F.ask)
def local[A](f: I => I)(fa: WriterT[F, W, A]): WriterT[F, W, A] =
fa.mapT(F.local(f))
def point[A](a: => A): WriterT[F, W, A] = a.point[WriterT[F, W, ?]]
def bind[A, B](fa: WriterT[F, W, A])(
f: A => WriterT[F, W, B]
): WriterT[F, W, B] = fa.flatMap(f)
}
import scalaz.{ Id, MonadListen, ReaderT }
import scalaz.std.list._
type P[A] = ReaderT[Id.Id, String, A]
type R[A] = WriterT[P, List[String], A]
val MR = MonadReader[R, String]
val MW = MonadListen[R, List[String]]
def apply: R[String] = MR.ask >>= { greeting =>
MW.tell(List(s"greeting $greeting")) >>= { _ =>
MW.point(s"Hello $greeting")
}
}
关于scala - 如何在 scalaz 中堆叠 ReaderT 和 WriterT 转换器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43337261/
如何访问 ReaderT 的内部 monad。 在我的例子中,我有类型: newtype VCSSetupAction a = VCSSetupAction (ReaderT (Maybe VCSCo
我正在使用 ReaderT 为这种类型编写 Monad 实例并通过派生 newtype HIO a = HIO {runHIO :: Set HiPermission -> IO a} 我试过这样做
我想这样玩元组和镜头: myfct :: ReaderT (a,b,c,d,e) m a -> ReaderT (a,c,d) m a myfct = zoom ... 能够将输入元组修改为它的子集.
假设我有这样的环境记录: import Control.Monad.IO.Class import Control.Monad.Trans.Reader type RIO env a = Reader
我一直在关注和扩展教程 Write Yourself A Scheme 。我有一个类型 LispVal 包裹在几层 monad 转换器中: import qualified Data.Map as M
看来能够组合不同的 ReaderT 环境会很有用。 例如,通用日志记录工具可能如下所示: logit :: Text -> ReaderT Bool IO () logit str = do deb
我想这样玩元组和镜头: myfct :: ReaderT (a,b,c,d,e) m a -> ReaderT (a,c,d) m a myfct = zoom ... 能够将输入元组修改为它的子集.
假设我有这样的环境记录: import Control.Monad.IO.Class import Control.Monad.Trans.Reader type RIO env a = Reader
我无法更改的函数返回 Scalaz Reader, type Action[A] = Reader[Session, A] def findAccount(s: String): Action[Acc
我基于 ReaderT design pattern 构建了一个项目.我没有使用类型类方法进行依赖注入(inject),而是选择使用简单的处理程序注入(inject)作为函数参数。这部分工作正常,因为
我经常使用以下样板,并希望将其消除。它看起来像这样: type Configured = ReaderT Config doSomething :: Configured IO Data doSome
如何使用 Reader/ReaderT 来询问列表类型,例如[(Int, Int)] 然后在列表 monad 内执行计算(要求的类型)? 下面是我损坏的代码,为了清晰起见,缩短了代码: attempt
我想将 ReaderT 嵌入到另一个 monad 转换器中。我该怎么做呢?下面的示例使用 Scotty但我认为这与任何其他 monad 都是一样的。 {-# LANGUAGE OverloadedSt
我在看the documentation对于Reader monad和 ReaderT单子(monad)变压器。 相关定义如下: newtype ReaderT k r m a :: forall k
通过保持 IORef 来通过异常来维护状态似乎要容易得多。而不是尝试使用 State Monad。下面我们有 2 个替代的 State Monad。一用StateT和另一个 ReaderT IORef
是否可以将以下函数重写为单行函数? action :: NewTenant -> AppM (Either TenantCreationError Tenant) action newTenant =
我正在使用 ReaderT Monad 转换器通过多个执行 IO 的函数从主函数传播配置数据。需要数据的最终函数不执行任何 IO。我有这个工作解决方案: import Control.Monad.Re
我正在设计一个小游戏,它基本上使用 StateT 并且只是更新状态。以下是简化版本: {-# LANGUAGE TemplateHaskell #-} import Control
我试图了解 Servant 的 serveWithContext 函数的用途。文档指出它不是 ReaderT Monad 的替代品,但我不确定它试图解决 ReaderT 尚未解决的问题。 例如,这是来
我想写一个haskell程序来读取配置并做点什么。配置是 Data.Map并将被注入(inject)到 Reader 中。当我们找不到配置项时,应该中断读取。刚刚停止,不需要错误消息。所以我只想要一个
我是一名优秀的程序员,十分优秀!