/ / gtk2hs: Impossibile corrispondere al tipo previsto 'IO [Int]' con il tipo effettivo '[Int]' - haskell, io, gtk2hs

gtk2hs: Impossibile corrispondere al tipo previsto 'IO [Int]' con il tipo effettivo '[Int]' - haskell, io, gtk2hs

tutti Voglio ottenere un elenco di numeri dalla GUIper fare alcune modifiche usando gtk2hs e restituire il risultato alla GUI. Tuttavia, ha ottenuto un sacco di errori. Sono un esordiente di Haskell, qualcuno potrebbe dirmi come aggiustarlo. Grazie !!

import Graphics.UI.Gtk
import Data.List

main :: IO ()
main= do
initGUI
window <- windowNew
set window [windowTitle := "Text Entry", containerBorderWidth := 10]

vb <- vBoxNew False 0
containerAdd window vb

hb <- hBoxNew False 0
boxPackStart vb hb PackNatural 0

txtfield <- entryNew
boxPackStart hb txtfield PackNatural 5
button <- buttonNewFromStock stockInfo
boxPackStart hb button PackNatural 0

txtstack <- statusbarNew
boxPackStart vb txtstack PackNatural 0
id <- statusbarGetContextId txtstack "Line"

widgetShowAll window
widgetSetSensitivity button False

onEntryActivate txtfield (saveText txtfield button txtstack id)
onPressed button (statusbarPop txtstack id)
onDestroy window mainQuit
mainGUI

saveText :: Entry -> Button -> Statusbar -> ContextId -> IO ()
saveText fld b stk id = do
txt <- entryGetText fld
result <- convert txt
lt <- first resultt
result2 <- combineTogether lt
mesg <-  " is the first element of input text" ++ txt

widgetSetSensitivity b True
msgid <- statusbarPush stk id mesg
return ()
convert :: [Int] -> IO [Int]
convert lstr = map read $ words lstr :: [Int]

converttoStr lst = map show lst

combineTogether :: [Int] -> IO[Char]
combineTogether lst = intercalate " " (converttoStr lst)

first :: [Int] -> IO [Int]
first (x:xs) = xs

Ecco il messaggio di errore:

[1 of 1] Compiling Main             ( testproject.hs, testproject.o )

testproject.hs:39:38:
Couldn"t match type ‘[]’ with ‘IO’
Expected type: IO Char
Actual type: [Char]
In a stmt of a "do" block:
mesg <- " is the first element of input text" ++ txt
In the expression:
do { txt <- entryGetText fld;
result <- convert txt;
lt <- first result;
result2 <- combineTogether lt;
.... }
In an equation for ‘saveText’:
saveText fld b stk id
= do { txt <- entryGetText fld;
result <- convert txt;
lt <- first result;
.... }

testproject.hs:39:79:
Couldn"t match type ‘Int’ with ‘Char’
Expected type: [Char]
Actual type: [Int]
In the second argument of ‘(++)’, namely ‘txt’
In a stmt of a "do" block:
mesg <- " is the first element of input text" ++ txt

testproject.hs:48:16:
Couldn"t match expected type ‘IO [Int]’ with actual type ‘[Int]’
In the expression: map read $ words lstr :: [Int]
In an equation for ‘convert’:
convert lstr = map read $ words lstr :: [Int]

testproject.hs:48:33:
Couldn"t match type ‘Int’ with ‘Char’
Expected type: String
Actual type: [Int]
In the first argument of ‘words’, namely ‘lstr’
In the second argument of ‘($)’, namely ‘words lstr’

testproject.hs:51:23:
Couldn"t match expected type ‘IO [Char]’ with actual type ‘[Char]’
In the expression: intercalate " " (converttoStr lst)
In an equation for ‘combineTogether’:
combineTogether lst = intercalate " " (converttoStr lst)

testproject.hs:54:16:
Couldn"t match expected type ‘IO [Int]’ with actual type ‘[Int]’
In the expression: xs
In an equation for ‘first’: first (x : xs) = xs

risposte:

4 per risposta № 1

La notazione è zucchero sintattico per una serie dioperazioni vincolanti. Con questo in mente, ha senso che ogni riga nel tuo blocco deve essere di tipo "IO" perché è così che hai definito la tua funzione.

Prova a cambiare la riga seguente

mesg <- " is the first element of input text" ++ txt

a

let mesg = " is the first element of input text" ++ txt

(che è anche equivalente a)

mesg <- return " is the first element of input text" ++ txt

Questo dovrebbe risolvere il problema che hai su quella particolare linea. E ha ancora più senso se guardiamo la firma del tipo della funzione "ritorno":

Monad m => a -> m a

Questo dice, "fornire un" a ", e io ti darò un" a "avvolto in una monade" (in questo caso la monade IO)

Spero che questo aiuti un po '.