2017-08-03 52 views
1

我試圖讓這段代碼的組合框控件的值:獲取Gtk2Hs組合框控件的值

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 

在此先感謝。

+0

你*可以*使用'fromString'就像那樣。你爲什麼相信你不能? –

回答

0

如果我們看documentation,我們看到ComboBoxTextText一個別名:

type ComboBoxText = Text 

現在TextString是來表示文字兩種方式,但Text這是否在一個緊湊的而String(這實際上是[Char]的別名)以鏈表方式(這會消耗更多的內存並且通常會導致效率較低的處理)執行此操作。

使用unpack

但是,您可以簡單地使用pack :: String -> Text and unpack :: Text -> StringStringText之間的轉換:

pack :: String -> Text

unpack :: Text -> String

所以,你可以使用:

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

OverloadedStrings

不過這是相當低效的工作:你會先轉換TextString,然後哈斯克爾將執行(通常)效率較低的比較。

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

{-# 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()

哈斯克爾將推導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功能。