- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数返回一个包裹在 Monad 中的值,
produceMessage :: MonadIO m => KafkaProducer -> ProducerRecord -> m (Maybe KafkaError)
我有一些代码可以像这样调用这个函数
err <- produceMessage prod message
return $ Right ()
上面的代码是别人写的,我只是想了解这里发生了什么。这是函数的其余部分
messageSender :: KafkaProducer -> String -> Config.KafkaP (Either KafkaError ())
messageSender prod msg = do
message <- mkMessage Nothing (Just $ pack msg)
err <- produceMessage prod message
--forM_ err print
return $ Right ()
我有三个具体问题,
我很困惑 produceMessage
的类型签名是什么意思?类型约束是MonadIO m
,什么意思?
返回类型是 m (Maybe KafkaError)
,所以这会返回一个 Maybe
值,包裹在哪个 monad 中?
Right ()
如何在这里出现?总的来说我真的不是能够理解messageSender
的最后两行。
最佳答案
类型约束意味着该函数可用于为具有 MonadIO
实例的任何类型 m
返回值。通常,这意味着 IO
本身或构建在 IO
之上的 monad 堆栈。
produceMessage
返回的值部分由调用者 决定。需要一个 IO (Maybe KafkaError)
值?你可以得到它,因为 IO
有一个 MonadIO
实例。需要一个 MyCustomMonadStack(也许是 KafkaError)
?如果您为 MyCustomMonadStack
定义一个 MonadIO
实例,您就可以获得它。
据推测,Config.KafkaP
也有一个 MonadIO
实例,基于 messageSender
如何使用 produceMessage
。
messageSender
的返回值为Config.KafkaP (Either KafkaError ())
。表达式return $Right()
首先使用Right()
产生一个Either KafkaError()
类型的值,然后return
应用于 that 以生成类型为 Config.KafkaP (Either KafkaError ())
的值。请注意,注释行 -- forM_ err print
是唯一可能使用来自 produceMessage
的值的东西,所以现在 messageSender
假装produceMessage
起作用了,不管它是否起作用。
一个更健壮的定义实际上会以某种方式使用 produceMessage
的返回值,比如
err <- produceMessage prod message
return $ case err of
Nothing -> Right ()
Just theError -> Left theError
关于haskell - 如何处理 monadic 返回值 `m (Maybe Foo)` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55306279/
我有一个使用 HsOpenSsl 的 readPrivateKey 函数读取 Rsa key 的函数,不幸的是,我的函数的签名是这个 String -> IO (Maybe (IO Maybe Rsa
我有一个类型 data Foo = Foo { bar :: Bar, baz :: Baz } 我正在尝试解析文件以构造 Foo .我有函数可以尝试解析 Bar和 Baz成员(member) par
我有一个可能的列表和一个给我节点颜色的函数(如果存在): maybeNeighbors :: [Maybe Node] nodeColor :: Node -> Maybe Color 现在
我有一个可能的列表和一个给我节点颜色的函数(如果存在): maybeNeighbors :: [Maybe Node] nodeColor :: Node -> Maybe Color 现在
我想有一个类型的函数: f :: [Maybe a] -> Maybe [a] 例如 f [Just 3, Just 5] == Just [3, 5] f [Just 3, Nothing] ==
我刚开始学习 Haskell,我发现自己正在为家庭作业编写这段代码: eval :: ExprT -> Integer eval (Lit x) = x eval (Add x y) = (e
我有一个类型为 Integral => a -> a -> Maybe a 的函数 f。这意味着 f 1 2 是有效的代码,但是自然的组合,例如 f (f 3 4) 5 f 6 (f 7 8) f (
我刚开始学习 Haskell,我发现自己正在为家庭作业编写这段代码: eval :: ExprT -> Integer eval (Lit x) = x eval (Add x y) = (e
是否可以轻松(无需重新发明轮子)从 (Maybe a, b) 转换至 Maybe (a,b) .我看了Traversable但不能让它工作。 最佳答案 您也可以使用 Bitraversable : b
我正在处理一个库( ghcjs-dom ),其中每个函数都返回一个 IO (Maybe T) . 我有一个函数a with 返回 IO (Maybe x)和功能 b需要x作为参数并返回 IO (May
我想计算列表的两个 elemIndex 值的差值。 colours = ["blue", "red", "green", "yellow"] ib = elemIndex "blue" colours
有一个标准tryPick如果 F# 返回第一个(从左到右,如果有的话)函数在列表元素上成功应用的函数。我希望在 Haskell 中有一个像这样的标准函数。我 tried胡歌,没有找到任何东西。 我是
我想将 Gen (Maybe Int) 转换为 Maybe Int。我有一个生成 1 到 9 之间的随机 Just Int 的函数。我想使用单元格函数,但我无法更改其类型签名中的任何内容。有什么建议吗
我想将以下回调代码包装到 Maybe public class FooDataSource ... public Maybe get(){ return Maybe.create(emitte
我想将 Gen (Maybe Int) 转换为 Maybe Int。我有一个生成 1 到 9 之间的随机 Just Int 的函数。我想使用单元格函数,但我无法更改其类型签名中的任何内容。有什么建议吗
这可能是一件简单的事情,但我正在编写一个想要返回记录的函数,并且其中几个字段需要执行可能失败的操作,所以现在结果记录看起来像这样(假设它是类型别名为 MyRecord)。 { field1 : May
为什么流程会在这里抛出错误? type MaybeProp = { prop: ?number, } type DefinetlyProp = { prop: number, } const
我想建立一个 Repository返回 Single 的类. 该类应首先查看 Cache返回 Maybe如果 Maybe完成转到我的Service返回 Single interface Cache {
使用 Typescipt 4.x.x 我写了一些代码来实现其他语言 Elm/Rust/Haskell 中常用的 Maybe/Option 类型。 我想写一个可以接受映射类型的通用函数 type MyM
在 Elm 中,将 List (Maybe a) 转换为 Maybe (List a) 的好方法是什么? 逻辑很简单: 如果所有项都是Just a,则返回Just (List a) 否则,返回Noth
我是一名优秀的程序员,十分优秀!