2009-05-28 23 views

Antwort

38

Gut

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

Nein?

+0

hat es funktioniert! :) tnx – pier

2

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 haben

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
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‘

21

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"]