- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在https://en.wikibooks.org/wiki/Haskell/Monad_transformers , 我明白了
newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) }
然后将 MaybeT
实例化为 monad:
instance Monad m => Monad (MaybeT m) where
return = MaybeT . return . Just
-- The signature of (>>=), specialized to MaybeT m:
-- (>>=) :: MaybeT m a -> (a -> MaybeT m b) -> MaybeT m b
x >>= f = MaybeT $ do maybe_value <- runMaybeT x
case maybe_value of
Nothing -> return Nothing
Just value -> runMaybeT $ f value
我不理解 runMaybeT x
中的参数 x
。 runMaybeT
不应该接受一个对应于 a
的 arg 吗?但取而代之的是 x
,它是整个 MonadT
monad
最佳答案
这只是标准的记录语法。在类型定义中,例如
data Foo = Foo { a :: Int, b :: String }
我们自动获取函数 a::Foo -> Int
和 b::Foo -> String
大概不会让您感到惊讶。
MaybeT
绝对没有什么不同。 (它确实使用了 newtype
而不是 data
但这在这里并不重要,如果定义使用 data
代替也是如此)
newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) }
这给了我们一个函数 runMaybeT::MaybeT m a -> m (Maybe a)
和我们得到函数 a
和 b 的原因完全一样
在上面的简单示例中。这正是记录语法的作用。
特别是在这种情况下,与使用记录语法定义的 newtype
一样,runMaybeT
函数允许我们从抽象 MaybeT m a
到更“具体”的表示形式,作为 m (Maybe a)
类型的值。
这用于 >>=
的 MaybeT m
的实现:因为它的第一个参数(代码段中的 x
)是键入MaybeT m a
,我们首先需要runMaybeT
来获取类型m(Maybe a)
的“展开”值,然后使用 >>=
的“基本 monad”m
(此处显示为 do
符号)以“提取”Maybe
类型的值code> 然后以通常的方式进行模式匹配。
关于haskell - MaybeT 的 runMaybeT 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63237733/
在https://en.wikibooks.org/wiki/Haskell/Monad_transformers , 我明白了 newtype MaybeT m a = MaybeT { runMa
在https://en.wikibooks.org/wiki/Haskell/Monad_transformers , 我明白了 newtype MaybeT m a = MaybeT { runMa
我是一名优秀的程序员,十分优秀!