作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对m
应该放在Monad变压器右侧的位置感到困惑吗?
例如:WriterT
定义为
newtype WriterT w m a = WriterT { runWriterT :: m (a, w) }
ReaderT
被定义为
newtype ReaderT r m a = ReaderT { runReaderT :: r -> m a }
newtype ReaderT r m a = ReaderT { runReaderT :: m (r -> a) }
最佳答案
monad m
的位置将取决于应用于基础monad m
的monad转换器的功能和操作,因此,它由读写器应该添加到monad的功能确定。
记住runReaderT
和runWriterT
尽管具有暗示性的名称,实际上并没有做任何事情。他们只是解包一个新类型,正是它们包装的东西改变了monad m
。
我的意思是,给定monad m
,您可以通过考虑类型的monadic动作向其添加读者:
r -> m a
m (a, w)
r -> s -> m (a, s, w)
>>=
和
<*>
,而不必定义自己的运算符。)
m
时,为什么不将
m
放在开头并考虑以下类型的monadic动作呢?
m (r -> a)
m
添加太多功能。
Maybe
monad中执行此操作。因此,您想要编写如下内容:
myLookup :: Key -> Maybe Value
myLookup key = ...
Maybe
monad。如果使用
m (r -> a)
模式执行此操作,则会得到:
myLookup :: Key -> Maybe ([(Key,Value)] -> Value)
myLookup k = Just (\tbl -> ...)
Just
之前,我们必须提供一个
\tbl
(指示查找成功)。也就是说,单例操作(失败或带有返回值的成功)不能依赖于
r
中的信息,这些信息从签名
m (r -> a)
中应该是显而易见的。使用备用
r -> m a
模式更强大:
type M a = ([Key,Value]) -> Maybe a
myLookup :: Key -> M Value
myLookup key tbl = Prelude.lookup key tbl
readInput :: FilePath -> IO DataToProcess
readInput fp = withFile fp ReadMode $ \h -> ...
m (r -> a)
将其转换为:
data Config = Config { inputFile :: FilePath }
readConfig :: IO (Config -> DataToProcess)
readConfig = ...um...
r -> m a
,则将设置为:
type M a = Config -> IO a
readConfig :: M DataToProcess
readConfig cfg = withFile (inputFile cfg) ReadMode $ ...
m (r -> a)
r
中的信息的计算中即可。 (因此,如果基础monad为
Maybe
以允许计算发出错误信号,则可以将
r
中的值用于计算中,但确定计算是否成功必须独立于
r
。 )
r -> m a
版本严格更强大,可以用作单例和应用程序阅读器。
m
monad中:
m (a, w) -- if m is a monad this is always a monad
(m a, w) -- this is a monad for some, but not all, monads m
m
是
IO
,则
IO (a,w)
比
(IO a, w)
有用-对于后者,写入的
w
(例如,错误日志)不能取决于执行< cc>行动!同样,
IO
实际上不是单子。这只是一个应用。
(IO a, w)
是
m
,则
Maybe
会写一些内容,无论计算成功还是失败,而
(Maybe a, w)
如果返回
Maybe (a, w)
,则会丢失所有日志条目。两种形式都是单子形式,可以在不同情况下使用,它们分别对应于以不同顺序堆叠变压器:
MaybeT (Writer w) -- acts like (Maybe a, w)
WriterT w Maybe -- acts like Maybe (a, w)
Nothing
和
Maybe
而言,情况并非如此。这两个都是“好”阅读器
Reader
的同构:
MaybeT (Reader r)
ReaderT r Maybe
关于haskell - 对Haskell Monad变形金刚感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51864209/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!