- 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/
我正在尝试了解 monad 转换器,并且正在阅读 this page在 haskell wiki 上。 我感到困惑的代码如下: isValid :: String -> Bool isValid s
我试图通过在 ghci 中运行一些示例来理解 MaybeT: λ: import Control.Monad.Trans.Maybe λ: let x = return $ 42 :: MaybeT
在 IO 计算中工作,我最终得到了 case mbValue of … 的阶梯。 s 并发现我应该使用 Maybe monad 来简化代码。因为它在 IO 内计算,我需要得到 IO值,我使用了 May
我有一个程序。 import Control.Monad import Control.Monad.Identity import Control.Monad.Trans.Maybe import S
我有一个使用 Control.Monad.Random 的简单函数来创建一个可以对随机数进行采样的函数。 import Control.Monad.Random import Data.R
idris 有没有MaybeT来自 Haskell 还是我应该使用其他东西?我正在尝试使用 IO (Maybe a) 类型的许多值进行计算.怎么能结合Maybe和 IO到 Idris 中的单个 mon
在https://en.wikibooks.org/wiki/Haskell/Monad_transformers , 我明白了 newtype MaybeT m a = MaybeT { runMa
Haskell 如何知道每个 return 表达式哪个是正确的 monad 实例? newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) } i
查看 MaybeT: λ: import Monad.Trans λ: import Monad.Trans.Maybe λ: :t MaybeT MaybeT :: m (Maybe a) -> M
在https://en.wikibooks.org/wiki/Haskell/Monad_transformers , 我明白了 newtype MaybeT m a = MaybeT { runMa
这是一个与 Why doesn't Option have a fold method? 类似的问题,但对于函数式java。 如果选项为 None,我想执行一些副作用。除了if maybeT.isNo
重新访问我的 MaybeT 练习后,我收到警告说我也应该有 Applicative 实例。我试图实现它,但因为我找不到使用 Applicative m 将 m x 应用到 m f 的方法而陷入困境。我
对于我之前关于链接失败的问题,Michael Snoyman 建议我使用 MaybeT运行它们,所以如果它们中的任何一个失败,它就会短路到 Nothing . 我的印象是runDb在事务中运行所有内容
查看 Monad 的 MaybeT 实例中 fail 的源代码: instance (Monad m) => Monad (MaybeT m) where fail _ = MaybeT (r
具体来说,假设我有这个 monadT 堆栈: type MHeap e ret = MaybeT ( StateT [e] Identity ) ret 和一个方便的 runMheap 函数: run
我一直在使用Haxl monad(在此处描述:http://www.reddit.com/r/haskell/comments/1le4y5/the_haxl_project_at_facebook_
如果我为 Identity 定义单子(monad)变压器类型,可以推导出Show实例。 newtype IdentityT f a = IdentityT { runIdentityT :: f
说我有一些foo :: Maybe Int例如,我想将它与 bar :: Int -> MaybeT (Writer String) Int 绑定(bind),这样做的惯用方法是什么? 我可以定义自己
简短版本:当我使用 runMaybeT 时然后runState在 MaybeT (State ) () 类型的单子(monad)上,即使 Maybe 看起来也没有发生状态变化。结果等于Just ()
我正在尝试 MaybeT monad,特别是 MaybeT Identity String import Control.Monad.Trans.Maybe import Control.Monad.
我是一名优秀的程序员,十分优秀!