在 Gtk2Hs 中获取 ComboBox 小部件值
Get ComboBox widget value in Gtk2Hs
我正在尝试使用以下代码获取 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
提前致谢。
如果我们查看 documentation,我们会发现 ComboBoxText
是 Text
的别名:
type ComboBoxText = Text
现在 Text
和 String
都是表示文本的方式,但是 Text
以紧凑的方式实现了这一点,而 String
(实际上是[Char]
) 在链表方法中执行此操作(这会消耗更多内存并且通常会导致处理效率降低)。
使用unpack
然而,您可以简单地使用 pack :: String -> Text
and unpack :: Text -> String
在 String
和 Text
之间进行转换:
pack :: String -> Text
unpack :: Text -> String
所以你可以使用:
selectRadioB cb = do
ntxt <- comboBoxGetActiveText cb
case <b>fmap unpack</b> ntxt of
Just "Option 1" -> ...
Just "Option 2" -> ...
Just "Option 3" -> ...
return ()
与OverloadedStrings
一起工作
然而,这是非常低效的:您将首先将 Text
转换为 String
,然后 Haskell 将执行(通常)效率较低的比较。
但是您可以使用语言指令:
{-# LANGUAGE OverloadedStrings #-}
您可以将其放在文件的开头。现在这意味着如果你写一个字符串文字 Haskell 可以 将其解释为 Text
元素。
所以如果你写:
<b>{-# LANGUAGE OverloadedStrings #-}</b>
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
函数。
我正在尝试使用以下代码获取 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
提前致谢。
如果我们查看 documentation,我们会发现 ComboBoxText
是 Text
的别名:
type ComboBoxText = Text
现在 Text
和 String
都是表示文本的方式,但是 Text
以紧凑的方式实现了这一点,而 String
(实际上是[Char]
) 在链表方法中执行此操作(这会消耗更多内存并且通常会导致处理效率降低)。
使用unpack
然而,您可以简单地使用 pack :: String -> Text
and unpack :: Text -> String
在 String
和 Text
之间进行转换:
pack :: String -> Text
unpack :: Text -> String
所以你可以使用:
selectRadioB cb = do
ntxt <- comboBoxGetActiveText cb
case <b>fmap unpack</b> ntxt of
Just "Option 1" -> ...
Just "Option 2" -> ...
Just "Option 3" -> ...
return ()
与OverloadedStrings
一起工作
然而,这是非常低效的:您将首先将 Text
转换为 String
,然后 Haskell 将执行(通常)效率较低的比较。
但是您可以使用语言指令:
{-# LANGUAGE OverloadedStrings #-}
您可以将其放在文件的开头。现在这意味着如果你写一个字符串文字 Haskell 可以 将其解释为 Text
元素。
所以如果你写:
<b>{-# LANGUAGE OverloadedStrings #-}</b>
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
函数。