Sto utilizzando una libreria grafica in Haskell chiamata Threepenny-GUI. In questa libreria la funzione principale restituisce un oggetto monad UI
. Questo mi causa molto mal di testa come quando tento di decomprimere valori IO
in variabili locali. Ricevo errori lamentando diversi tipi di monade.Haskell do clausola con più tipi di monade
Ecco un esempio del mio problema. Questa è una versione leggermente modificata della funzione principale di serie, come dato da esempio di codice di tre soldi-GUI:
main :: IO()
main = startGUI defaultConfig setup
setup :: Window -> UI()
setup w = do
labelsAndValues <- shuffle [1..10]
shuffle :: [Int] -> IO [Int]
shuffle [] = return []
shuffle xs = do randomPosition <- getStdRandom (randomR (0, length xs - 1))
let (left, (a:right)) = splitAt randomPosition xs
fmap (a:) (shuffle (left ++ right))
Si prega di notare la quinta riga:
labelsAndValues <- shuffle [1..10]
che restituisce il seguente errore:
Couldn't match type ‘IO’ with ‘UI’
Expected type: UI [Int]
Actual type: IO [Int]
In a stmt of a 'do' block: labelsAndValues <- shuffle [1 .. 10]
Per quanto riguarda la mia domanda, come posso decomprimere la funzione IO
utilizzando la notazione a freccia standard (<-
) e continuare a Sono variabili come IO()
anziché UI()
, quindi posso facilmente passarle ad altre funzioni.
Attualmente, l'unica soluzione che ho trovato è stato quello di utilizzare liftIO
, ma questo fa sì che la conversione al tipo UI
Monade, mentre io in realtà voglio continuare a utilizzare il tipo di IO
.
Non è possibile modificare la modalità Monad a metà del blocco di do – Squidly
Cosa si intende per continuare a utilizzare il tipo di I/O? Sarebbe 'liftIO $ fare ... un blocco di codice IO ...' essere quello che stai cercando? –
In seguito alle conclusioni di questo thread, ho aperto una nuova domanda su come integrare la stampa. qualsiasi aiuto sarebbe molto apprezzato - http://stackoverflow.com/questions/30988595/haskell-ui-do-clause-how-to-print – vondip