我通过转换创建了一个组合框xmlWidget
to a comboBox
与功能castTocomboBox
现在我想获取活动项目的文本或索引。问题是如果我使用comboBoxGetActive
它返回一个函数IO Int
结果,我需要知道如何获得Int
价值。我尝试阅读有关 monad 的内容,以便了解在这种情况下可以做什么,但我似乎不明白。我感谢我能得到的所有帮助。我可能应该提到我使用Glade
and gtk2hs
.
作为一般规则,您可以编写如下内容:
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 的绑定类型几分钟,你可能会有所启发:
>>= :: IO a -> (a -> IO b) -> IO b
第一个参数是“comboBoxGetActive”返回的初始“IO Int”值。第二个是一个函数,它获取 Int 值并将其转换为其他 IO 值。因此,您可以处理 Int,但这样做的结果永远不会从 IO monad 中逃逸。
(当然,有臭名昭著的“unsafePerformIO”,但以您的知识水平,您可能会确定,如果您使用它,那么您就做错了。)
(实际上,脱糖要复杂得多,以允许失败的模式匹配。但你可以假装我写的是真的)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)