gpt4 book ai didi

haskell - 如何处理 monadic 返回值 `m (Maybe Foo)` ?

转载 作者:行者123 更新时间:2023-12-05 00:10:59 31 4
gpt4 key购买 nike

我有一个函数返回一个包裹在 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 ()

我有三个具体问题,

  1. 我很困惑 produceMessage 的类型签名是什么意思?类型约束是MonadIO m,什么意思?

  2. 返回类型是 m (Maybe KafkaError),所以这会返回一个 Maybe 值,包裹在哪个 monad 中?

  3. 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com