2009-05-28 6 views

risposta

38

Bene

f :: [String] -> [Int] 
f = map read 

No?

+0

ha funzionato! :) tnx – pier

2

La risposta generale a tali domande è suddividere l'attività in parti: [String] -> [Int] sembra una combinazione di String -> Int e [a] -> [b]. Hoogle (linked) vi darà alcuni risultati ad entrambi, vediamo ...

$ Hoogle 'String -> Int'
Test.HUnit.Base Etichetta :: String -> Nodo errore
Prelude: : [Char] -> una lunghezza
Prelude :: [a] -> Int
lunghezza Data.List :: [a] -> Int
Data.Char digitToInt :: Char -> Int
Data.Char ord :: Char -> Int
Debug.Trace trace :: String -> a -> a
Network.Buf ferType buf_fromStr :: BufferOp un -> String -> un
Network.Socket inviare :: Socket -> String -> IO Int
Graphics.UI.GLUT.Callbacks.Window Char :: Char -> Chiave di lettura
Prelude :: Leggi a => stringa -> un
Text.Read letti :: Leggi a => stringa -> un Data.String fromstring :: IsString a => stringa
-> un
GHC.Exts fromstring :: IsString a => stringa -> un
Control.Monad.Trans.Error strMsg :: errore a => stringa -> un
Control.Monad.Error.Class strMsg :: errore a => stringa -> un
. ..

Uh, un sacco di spazzatura. Siamo in grado di eliminare quelli prima dai pacchetti non hai niente a che fare con ...

errore Prelude :: [Char] -> una lunghezza
Prelude :: [a] -> Int
lunghezza Data.List :: [a] -> Int
Data.Char digitToInt :: Char -> Int
Data.Char ord :: Char -> Int
Prelude letti :: Leggi a => stringa -> un
testo. Leggi leggi :: Leggi a => String -> a
Data.String fromString :: IsString a => String -> a
Text.Printf printf :: PrintfType r => Stringa -> R

error suona quasi come quello che si vuole. length neanche. digitToInt? Sembra una specie di diritto - e funziona di fatto, ma solo con numeri a una cifra. read? Forse non il nome che ti saresti aspettato, ma se ci pensi, questa è la cosa giusta: convertire una stringa in qualcosa di più significativo (come un numero) è come leggere del testo.

destro, sul lato opposto Hoogle ci dà la cosa che vogliamo proprio davanti:

$ Hoogle '[a] -> [b]'
Prelude mappa :: (a -> b) -> [a] -> [b]
Data.List map :: (a -> b) -> [a] -> [b]
Prelude concatMap :: (a -> [b]) - > [a] -> [b]
Data.List concatMap :: (a -> [b]) -> [a] -> [b]
Dati.Mappa mappaMaybe :: (a -> Forse b) -> [a] -> [b]
Ciclaggio preludio e :: [a] -> [a]
Data.List ciclo :: [a] -> [a]
Prelude init :: [a] -> [a]
Data.List init :: [ a] -> [a]
Prelude invertire :: [a] -> [a]

Come potete vedere la maggior parte di queste funzioni sono chiamati qualcosa con "mappa", che non potrebbero ancora una volta essere il nome ti aspettavi - ma apparentemente è ciò che viene chiamata questa operazione! Quello che stai cercando è abbastanza semplice.

Infine, dobbiamo combinare queste due funzioni. map ha bisogno di un'altra funzione come primo argomento: beh, ovviamente è read! Quindi applica semplicemente map a read. L'argomento successivo è l'elenco di [a] s: aha, abbiamo già finito!

È possibile controllare questo con il lancio fino ghci:

Prelude>: t Cartina
mappa letti :: Leggi B => [String] -> [b]

C'è ancora questo b qui invece di Int, ma non importa che: b può essere qualsiasi tipo che vuoi! - a condizione che abbia un'istanza Read. Int ha:

Prelude>: int
dati Int = GHC.Types.I # GHC.Prim.Int # - Definito in `GHC.Types'
esempio Limitata Int - Definito in` GHC.Enum '
esempio Enum Int - Definito in `GHC.Enum'
esempio Eq Int - Definito in` GHC.Classes'
esempio integrale Int - Definito in `GHC.Real'
esempio Num Int - Definito in `GHC.Num '
istanza Ord Int - Definito in` GHC.Classes'
istanza Leggi Int - Definito in `GHC.Read '
istanza Real Int - Definito in` GHC.Real'
istanza Mostra Int - Definito in `GHC.Show'

21

Questo fallisce:

map read ["1","2"] 
[*Exception: Prelude.read: no parse 

Il modo per farlo è:

map (read::String->Int) ["1","2"] 
[1,2] 
:: [Int] 

Al di fuori di GHCI, in un file di .hs sarebbe:

let intList = map (read::String->Int) ["1","2"]