PDA

View Full Version : [Haskell] Funzioni IO()


bender86
05-11-2010, 15:07
Ho un problema con un programma in Haskell. Devo implementare una funzione che, data una lista di coppie [ ( String, [String] ) ] mi generi una funzione IO (String -> String) che ritorna un elemento scelto a caso dalla lista in ingresso.

In breve: da [("prima", ["A", "B"]), ("seconda", ["C"])] potrebbe generare due funzioni
f1 "prima" = "A"
f1 "seconda" = "C"
e
f2 "prima" = "B"
f2 "seconda" = "C"

Questa è la definizione della funzione:stateOfMind :: BotBrain -> IO (Phrase -> Phrase)
stateOfMind brain =
do
r <- randomIO :: IO Float
return (rulesApply (zip ps (pick r pps)))
where
(ps, pps) = unzip brain
Il modulo viene caricato e compilato correttamente, quindi mi genera la funzione che mi serve (corretta o meno, non è questo il punto).

Questo è quello che risponde l'interprete:> :type stateOfMind
stateOfMind :: BotBrain -> IO (Phrase -> Phrase)

> let mind = stateOfMind brain
> :type mind
mind :: IO (Phrase -> Phrase)

Il mio problema è che non riesco a capire come chiamare la funzione mind.> :type phrase
phrase :: Phrase
> :type phrase2
phrase :: IO Phrase

> mind phrase
<interactive>:1:0:
Couldn't match expected type `IO Phrase -> t'
against inferred type `IO (Phrase -> Phrase)'
In the expression: mind phrase
In the definition of `it': it = mind phrase

> mind phrase2
<interactive>:1:0:
Couldn't match expected type `Phrase -> t'
against inferred type `IO (Phrase -> Phrase)'
In the expression: mind phrase2
In the definition of `it': it = mind phrase2

marco.r
05-11-2010, 15:54
Tu genere una funzione con tipo "IO (Phrase -> Phrase)", ma in realta' ti serve una funzione Phrase -> IO Phrase

La differenza e' che la prima, quando valutata nel IO Monad, senza argomenti, ti ritorna la funzione, l'altra quando la valuti nell'ambito del Monad, passandogli la frase con argomento, ritorna come risultato l'output voluto

Puoi comunque fare lo stesso, sol ocon un passo in piu': prima valuti trovi la funzione e poi la applichi "puramente"

ovvero


let mind = stateOfMind brain
function <- mind -- Function ora ha tipo Phrase -> Phrase
let result = function phrase -- result ha tipo Phrase

o, meglio ancora

mind <- stateOfMind brain
let result = mind phrase


Non hai postato codice funzionante, ma dovrebbe andare.

bender86
05-11-2010, 18:29
Tu genere una funzione con tipo "IO (Phrase -> Phrase)", ma in realta' ti serve una funzione Phrase -> IO Phrase
Già, ma questo è un esercizio, la firma della funzione è quella e me la devo tenere. Oltretutto fa parte di un programma più grande, io volevo valutarla dall'interprete solo perché non ero sicuro funzionasse a dovere (ed avevo ragione...).


let mind = stateOfMind brain
function <- mind -- Function ora ha tipo Phrase -> Phrase
let result = function phrase -- result ha tipo Phrase

Perfetto, proprio quello che mi serviva.

Non hai postato codice funzionante, ma dovrebbe andare.
Sì, volevo solo sapere come convertire IO (Phrase -> Phrase) in Phrase -> IO Phrase, cioè usare <-. Mi riguarderò il capitolo sui Monad.

Grazie mille