Ich habe eine Liste von Strings, ist es möglich, es in eine Liste von Ints zu konvertieren?
zB:Konvertiere String Liste in Int Liste
["1","2"] -> [1,2]
Ich habe eine Liste von Strings, ist es möglich, es in eine Liste von Ints zu konvertieren?
zB:Konvertiere String Liste in Int Liste
["1","2"] -> [1,2]
Gut
f :: [String] -> [Int]
f = map read
Nein?
Die allgemeine Antwort auf solche Fragen ist, die Aufgabe in Teile aufzuteilen: [String] -> [Int]
sieht wie eine Kombination aus String -> Int
und [a] -> [b]
aus. Hoogle (verlinkt) werden Ihnen einige Ergebnisse beide, mal sehen ...
$ Hoogle 'String -> Int'
Test.HUnit.Base Etikett :: String -> Node
Prelude Fehler: : [Char] -> a
Prelude Länge :: [a] -> Int
Data.List Länge :: [a] -> Int
Data.Char digitToInt :: Char -> Int
Data.Char ord :: Char -> Int
Debug.Trace Ablaufverfolgung :: String -> a -> a
Network.Buf ferType buf_fromStr :: BufferOp a -> String -> a
Network.Socket senden :: Socket -> String -> IO Int
Graphics.UI.GLUT.Callbacks.Window Char :: Char -> Key
Prelude Lese :: lesen Sie ein => String -> a
Text.Read lesen :: lesen Sie ein => String -> a
Data.String vonString :: IstZeichenfolge a => String -> ein
GHC.Exts vonString :: IstZeichenfolge a => String -> a
Control.Monad.Trans.Error strMsg :: Fehler a => String -> a
Control.Monad.Error.Class strMsg :: Fehler a => String -> a
. ..
Ugh, eine Menge Müll. Wir können zunächst diejenigen, die aus Paketen beseitigen Sie nichts mit ...
zu tun habenPrelude Fehler :: [Char] -> a
Prelude Länge :: [a] -> Int
Data.List Länge :: [a] -> Int
Data.Char digitToInt :: Char -> Int
Data.Char ord :: Char -> Int
Prelude lesen :: lesen Sie ein => String -> a
Text. Lesen lesen :: Lesen Sie a => String -> a Data.String von String :: IsString a => String -> a
Text.Printf printf :: PrintfType r => String -> r
error
klingt kaum wie das, was Sie wollen. length
weder. digitToInt
? Klingt irgendwie richtig - und funktioniert in der Tat, aber nur mit einstelligen Zahlen. read
? Vielleicht nicht der Name, den Sie erwartet hätten, aber wenn Sie darüber nachdenken, ist dies das Richtige: Eine Zeichenfolge in etwas aussagekräftigeres (wie eine Zahl) umzuwandeln ist wie das Lesen eines Textes.
rechts, auf der anderen Seite Hoogle gibt uns das, was wir ganz vorne wollen:
$ Hoogle '[a] -> [b]'
Prelude Karte :: (a -> b) -> [a] -> [b]
Daten.Listenkarte :: (a -> b) -> [a] -> [b]
Auftakt concatMap :: (a -> [b]) - > [a] -> [b]
Daten.Liste concatMap :: (a -> [b]) -> [a] -> [b]
Data.Maybe mapMaybe :: (a -> Vielleicht b) -> [a] -> [b]
Prelude zykl e :: [a] -> [a]
Data.List Zyklus :: [a] -> [a]
Prelude init :: [a] -> [a]
Data.List init :: [ a] -> [a]
Prelude Reverse :: [a] -> [a]
Wie Sie die meisten dieser Funktionen sehen sind, etwas mit "Karte" genannt, was vielleicht wieder nicht der Name sein Du hast es erwartet - aber anscheinend nennt man diese Operation! Der, nach dem du suchst, ist ziemlich einfach.
Schließlich müssen wir diese beiden Funktionen kombinieren. map
benötigt eine andere Funktion als erstes Argument - nun, das ist natürlich read
dann! So wenden Sie einfach map
an read
an. Das nächste Argument ist die Liste der [a]
s: Aha, wir sind schon fertig!
Sie können dies durch die Einführung bis GHCI:
Prelude>: t Karte lesen
Karte lesen :: Lesen b => [String] -> [b]
Es gibt immer noch diese b
hier anstelle von Int
, aber macht nichts dagegen: b
kann jede Art sein, die Sie wollen! - vorausgesetzt, es hat eine Read
Instanz. Int
hat:
Prelude>: i
Daten Int Int = GHC.Types.I # GHC.Prim.Int # - Definiert in `GHC.Types'
Instanz Bounded Int - Definiert in` GHC.Enum '
Instanz Enum Int - definiert in `GHC.Enum'
Instanz Eq Int - definiert in` GHC.Classes'
Instanz Integral Int - definiert in `GHC.Real‘
Instanz Num Int - Definiert in `GHC.Num '
Instanz Ord Int - Definiert in` GHC.Classes'
Instanz Int - definiert in `GHC.Read '
Instanz Real Int - Definiert in` GHC.Real' Instanz Show Int - Definiert in `GHC.Show‘
Dies schlägt fehl:
map read ["1","2"]
[*Exception: Prelude.read: no parse
Die Art und Weise, es zu tun ist:
map (read::String->Int) ["1","2"]
[1,2]
:: [Int]
Außerhalb GHCI, in einem .hs Datei wäre es:
let intList = map (read::String->Int) ["1","2"]
hat es funktioniert! :) tnx – pier