PDA

View Full Version : [HASKELL] Aggiungere elemento ad una lista da input


Dan__88
03-11-2011, 18:18
Ciao a tutti!
Mi trovo davanti a questo problema, ipotizziamo di avere una funzione:
f:: [String] -> [String]
che prenda una lista di stringhe e restituisca la stessa lista, aggiungendo un elemento preso da input, ad esempio tramite la funzione getLine

Mi sapreste dire come fare?
Consideriamo che la stessa funzione è chiamata da un'altra che restituisce il medesimo tipo (una lista di stringhe), dunque il tipo di uscita non è modificabile

marco.r
03-11-2011, 21:23
Ciao a tutti!
Mi trovo davanti a questo problema, ipotizziamo di avere una funzione:
f:: [String] -> [String]
che prenda una lista di stringhe e restituisca la stessa lista, aggiungendo un elemento preso da input, ad esempio tramite la funzione getLine

Mi sapreste dire come fare?
Consideriamo che la stessa funzione è chiamata da un'altra che restituisce il medesimo tipo (una lista di stringhe), dunque il tipo di uscita non è modificabile
Non puoi.
Una qualsias funzione che legga dei dati da input (o li scriva in output) deve far parte dell' IO Monad, quindi deve avere signature del tipo

a -> IO b

(nel tuo caso a e b sarebbero [String].
Quindi hai tue alternatve. La prima e' quella di cambiare il tipo della funzione in [String] -> IO [String]. In questo caso l'implementazione potrebbe essere qualcosa tipo

f :: [String] -> IO [String]
f xs = do line <- getLine
return (xs++s)

Ma mi par di capire che questo non lo puoi fare.
Allora devi cambiare l'approccio, per cui leggi "tutte le righe" in maniera lazi
e poi le passi come argomento alla tua funzione che le usa (la lettura delle righe in pratica verra' fatta "lazy" man mano che i dati vengono usati)

Per cosa devi usare l'input ? Cosi' magari riusciamo a fare un esempio pratico.

Dan__88
03-11-2011, 21:38
è difficile da spiegare...
In pratica ho una funzione che a seconda di un determinato Patter Matching chiama altre funzioni, ognuna di essere modifica questa lista in un modo diverso.
Me ne servirebbe una che la modifica prendendo il valore da input, ma avevo già immaginato che non si potesse fare, volevo solo la conferma!