gpt4 book ai didi

haskell - 将 IO Int 转换为 Int

转载 作者:行者123 更新时间:2023-12-03 22:51:01 26 4
gpt4 key购买 nike

我通过转换 xmlWidget 创建了一个组合框到 comboBox使用函数 castTocomboBox现在我想获取事件项目的文本或索引。问题是,如果我使用 comboBoxGetActive它返回一个 IO Int 的函数结果,我需要知道如何获得 Int值(value)。我试图阅读有关 monad 的内容,以便了解在这种情况下可以做什么,但我似乎不明白。我很感激我能得到的所有帮助。我可能应该提到我使用 Gladegtk2hs .

最佳答案

作为一般规则,您可以编写如下内容:

do
x <- somethingThatReturnsIO
somethingElseThatReturnsIO $ pureFunction x

没有办法从“IO Int”中获取“Int”,除非在 IO Monad 中做其他事情。

在 monad 术语中,上面的代码脱糖成
somethingThatReturnsIO >>= (\x -> somethingElseThatReturnsIO $ pureFunction x)

“>>=”运算符(发音为“bind”)具有将“IO Int”转换为“Int”的魔力,但它拒绝直接将该 Int 提供给您。它只会将该值作为参数传递给另一个函数,并且该函数必须在“IO”中返回另一个值。思考一下 IO monad 的绑定(bind)类型几分钟,你可能会有所启发:
>>= :: IO a -> (a -> IO b) -> IO b

第一个参数是“comboBoxGetActive”返回的初始“IO Int”值。第二个是获取 Int 值并将其转换为其他 IO 值的函数。因此,您可以处理 Int,但这样做的结果永远不会从 IO monad 中逃脱。

(当然有臭名昭著的“unsafePerformIO”,但以您的知识水平,您可能会确定如果您使用它,那么您做错了。)

(实际上脱糖是相当复杂的,以允许失败的模式匹配。但你可以假装我写的是真的)

关于haskell - 将 IO Int 转换为 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4235348/

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