【问题标题】:Get ComboBox widget value in Gtk2Hs在 Gtk2Hs 中获取 ComboBox 小部件值
【发布时间】:2017-08-03 21:32:15
【问题描述】:

我正在尝试使用此代码获取 ComboBox 小部件值:

selectRadioB cb = do
ntxt <- comboBoxGetActiveText cb
case ntxt of
            Just ("Option 1") -> ...
            Just ("Option 2") -> ...
            Just ("Option 3") -> ... 
return ()

但是,当我编译它时,出现了这个错误:

  Couldn't match type ‘[Char]’
                   with ‘text-1.2.2.0:Data.Text.Internal.Text’
    Expected type: ComboBoxText
      Actual type: [Char]
    In the pattern: "Option 1"
    In the pattern: Just ("Option 1")
    In a case alternative:
        Just ("Option 1") -> ...

我该如何解决?我提出了一个类似的问题(Create a ComboBox widget in Gtk2HS),但我不想使用打包功能。

为什么我不能像这样使用 fromString?

cb <- comboBoxNewText
comboBoxAppendText cb (fromString "Option 1")
comboBoxAppendText cb (fromString "Option 2")
comboBoxAppendText cb (fromString "Option 3")
comboBoxSetActive cb 0

提前致谢。

【问题讨论】:

  • 可以像这样使用fromString。为什么你认为你做不到?

标签: haskell combobox gtk2hs


【解决方案1】:

如果我们查看documentation,我们会发现ComboBoxTextText 的别名:

type ComboBoxText = Text

现在TextString 都是表示文本的方式,但Text 以紧凑的方式执行此操作,而String(实际上是[Char] 的别名)在链接列表中执行此操作方法(这会消耗更多内存,通常会导致处理效率降低)。

使用unpack

不过,您可以简单地使用pack :: String -&gt; Text and unpack :: Text -&gt; StringStringText 之间进行转换:

pack :: String -&gt; Text

unpack :: Text -&gt; String

所以你可以使用:

selectRadioB cb = do
    ntxt <- comboBoxGetActiveText cb
    case fmap unpack ntxt of
            Just "Option 1" -> ...
            Just "Option 2" -> ...
            Just "Option 3" -> ... 
    return ()

使用OverloadedStrings

尽管如此,这是非常低效的:您将首先将 Text 转换为 String,然后 Haskell 将执行(通常)效率较低的比较。

但是,您可以使用语言指令:

{-# LANGUAGE OverloadedStrings #-}

您可以放在文件的开头。现在这意味着如果您编写字符串文字,Haskell 可以将其解释为 Text 元素。

所以如果你写:

{-# LANGUAGE OverloadedStrings #-}

selectRadioB cb = do
    ntxt <- comboBoxGetActiveText cb
    case ntxt of
            Just "Option 1" -> ...
            Just "Option 2" -> ...
            Just "Option 3" -> ...
    return ()

Haskell 将推导出ntxt 的类型为Maybe Text,因此"Option 1" 应被解释为Text 元素。

如果你使用这个语法扩展,你也可以这样写:

{-# LANGUAGE OverloadedStrings #-}

-- ...

cb <- comboBoxNewText
comboBoxAppendText cb "Option 1"
comboBoxAppendText cb "Option 2"
comboBoxAppendText cb "Option 3"
comboBoxSetActive cb 0

所以你可以放弃fromString 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多