将IO Int转换为Int

iza*_*yoi 13 io syntax monads haskell

我已经创建了一个组合框,从使用该函数转换xmlWidget为a comboBox,castTocomboBox现在我想获取活动项的文本或索引.问题是如果我使用该comboBoxGetActive函数它会返回一个IO Int结果,我需要知道如何获取该Int值.我试着阅读关于monads的内容,这样我就能理解在这样的情况下可以做些什么,但我似乎并不理解.我很感激能得到的所有帮助.我应该提一下,我用Gladegtk2hs.

Pau*_*son 27

作为一般规则,你写这样的东西:

do
   x <- somethingThatReturnsIO
   somethingElseThatReturnsIO $ pureFunction x
Run Code Online (Sandbox Code Playgroud)

除了在IO Monad中执行其他操作外,无法从"IO Int"中获取"Int".

用monad术语来说,上面的代码是desugars into

somethingThatReturnsIO >>= (\x -> somethingElseThatReturnsIO $ pureFunction x)
Run Code Online (Sandbox Code Playgroud)

">> ="运算符(发音为"bind")具有将"IO Int"转换为"Int"的魔力,但它拒绝将Int直接赋予您.它只会将该值作为参数传递给另一个函数,该函数必须在"IO"中返回另一个值.冥想IO monad的绑定类型几分钟,你可能会受到启发:

>>= :: IO a -> (a -> IO b) -> IO b
Run Code Online (Sandbox Code Playgroud)

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

(当然有臭名昭着的"unsafePerformIO",但在您的知识水平上,您可能会确定如果您使用它,那么您做错了.)

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


Lan*_*dei 11

好吧,有不安全的PerformIO:http://haskell.org/ghc/docs/6.12.1/html/libraries/base-4.2.0.0/System-IO-Unsafe.html#v:unsafePerformIO

(如果您想知道如何找到此方法:请访问http://www.haskell.org/hoogle并在此处搜索您需要的签名IO a -> a)

也就是说,你可能听说过"IO在IO中会发生什么".而且有非常充分的理由对这个(刚读unsafePerformIO的文档).所以你很可能遇到设计问题,但为了从经验丰富的Haskellers那里获得帮助(我当然不是),你需要更详细地描述你的问题.

  • @downvoter:你能解释一下吗?我认为我的答案是正确的:我解释了你如何能够做到被问到的事情,而且这很可能是一个坏主意. (3认同)