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那里获得帮助(我当然不是),你需要更详细地描述你的问题.