Ho una lista di stringhe, è possibile convertirlo in una lista di ints?
esempio:Converti lista di stringhe in lista int
["1","2"] -> [1,2]
Ho una lista di stringhe, è possibile convertirlo in una lista di ints?
esempio:Converti lista di stringhe in lista int
["1","2"] -> [1,2]
Bene
f :: [String] -> [Int]
f = map read
No?
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'
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"]
ha funzionato! :) tnx – pier