我已经创建了一个组合框从转换一个 xmlWidget 来一个 comboBox 与功能 castTocomboBox 现在我想要得到文字或指数的活动项目。问题是,如果我用的 comboBoxGetActive 功能返回一个 IO Int 结果我需要知道如何可以获得的 Int 值。我试图阅读有关单元,所以我能理解什么一个可以做这样的情况,但我似乎没理解。我感谢所有帮助我可以得到的。也许我应该说我的使用 Gladegtk2hs.

有帮助吗?

解决方案

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

do
   x <- somethingThatReturnsIO
   somethingElseThatReturnsIO $ pureFunction x

有没有办法得到“内部”出“IO诠释”,除了做在IO Monad的东西。

在单子而言,上面的代码desugars成

somethingThatReturnsIO >>= (\x -> somethingElseThatReturnsIO $ pureFunction x)

在“>> =”运算符(发音为“绑定”)不转换“IO内部”为“内部”的魔法,但它拒绝给该诠释直给你。它只会将该值传递到另一个函数作为参数,而函数必须在“IO”返回另一个值。上绑定为IO的类型冥想单子几分钟,并可能受到启发:

>>= :: IO a -> (a -> IO b) -> IO b

第一个参数是初始“IO内部”值,该值“comboBoxGetActive”被返回。第二个是一个函数,它的int的值和把它变成一些其它IO值。因此,你可以处理中等,但这样做不会从IO单子逸出的结果。

(当然还有臭名昭著的“unsafePerformIO”,但在你的知识水平,你可以肯定的是,如果你使用它,那么你错了做这件事。)

(其实是脱糖多而复杂,允许失败的模式匹配,但你可以假装我写的是真实的)

其他提示

嗯,有unsafePerformIO: 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(我肯定不会),需要描述了你的问题更加详细。

要了解这些类型是由-step步进,首先查找什么也许和列表是:

data Maybe a = Nothing | Just a
data [a]     = [] | a : [a]

(的也许)是不同的类型(的),像(的也许诠释)从(<强>内部的不同)。 的类型的示例值(的也许诠释)是 的仅有5 和<强>没有

的列表(的)s时,可以写为(的 []一个)和As(的并[a] )。的(的 [INT] )实施例值的 [1,7,42] 和<强> []

现在,一(的 IO一个)比不同的事情(的),得:这是一个输入/输出-计算,其计算类型的值(的)。换句话说:它是一个脚本或程序,其具有要被执行,以产生类型的值(的)。 的一个例子(的 IO字符串)是的函数getline 下,其读取一行从标准输入文本的。

现在,comboBoxGetActive的类型是:

comboBoxGetActive :: ComboBoxClass self => self -> IO Int

这意味着,comboBoxGetActive是一个函数(的 - > ),其从具有式级ComboBoxClass的一个实例(基本类型的类在某种程度上类似于Java接口)的任何类型的映射到(的 IO诠释)。每一次,此函数(的 - > )与该类型的相同的输入值来评价(的)(无论其类型是),其导致相同的值:它始终是类型的相同的值(的 IO诠释),这意味着它总是相同的脚本。但是,当你在不同的时间执行相同的脚本,它可以产生类型的不同值(<强>内部)。

你的程序的主要功能有类型(的 IO()),这意味着,编译器和运行期系统评估方程您在此功能性的语言对的主值进行编程,这将立即启动该程序来执行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top