2009-05-28 20 views

Respuesta

38

Bueno

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

n?

+0

¡funcionó! :) tnx – pier

2

La respuesta general a estas preguntas es dividir la tarea en partes: [String] -> [Int] parece una combinación de String -> Int y [a] -> [b]. Hoogle (vinculado) le dará algunos resultados a tanto, vamos a ver ...

Hoogle

$ 'String -> Int'
Test.HUnit.Base Etiqueta :: String -> Nodo de error
Preludio: : [Char] -> una longitud
Preludio :: [a] -> Int
longitud 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 a -> String -> un
Network.Socket enviar :: Socket -> String -> IO Int
Graphics.UI.GLUT.Callbacks.Window Char :: Char -> Clave de lectura
Preludio :: Lea a => String -> un
Text.Read leídos :: Read a => String -> un Data.String fromstring :: IsString a => cadena
-> un
GHC.Exts fromstring :: IsString a => String -> un
Control.Monad.Trans.Error strMsg :: error a => String -> un
Control.Monad.Error.Class strMsg :: error a => String -> un
. ..

Ugh, mucha basura. Podemos eliminar primero las de los paquetes que no tienen nada que ver con ...

error Preludio :: [Char] -> una longitud
Preludio :: [a] -> Int
longitud Data.List :: [a] -> Int
Data.Char digitToInt :: Char -> Int
Data.Char ord :: Char -> Int
Preludio leídos :: Read a => String -> un texto
. Leer leer :: Leer a => Cadena -> a
Data.String fromString :: IsString a => Cadena -> a
Text.Printf printf :: PrintfType r => String -> r

error suena casi igual que lo que quiere. length ninguno. digitToInt? Suena como correcto, y funciona de hecho, pero solo con números de un solo dígito. read? Quizás no sea el nombre que esperabas, pero si lo piensas bien, es lo correcto: convertir una cadena en algo más significativo (como un número) es como leer un texto.

derecho, en el otro lado Hoogle nos da lo que queremos derecha en la delantera:

$ Hoogle '[a] -> [b]'
mapa Preludio :: (a -> b) -> [a] -> [b]
Data.List map :: (a -> b) -> [a] -> [b]
Preludio concatMap :: (a -> [b]) - > [a] -> [b]
Data.List concatMap :: (a -> [b]) -> [a] -> [b]
Data.Maybe mapMaybe :: (a -> Maybe b) -> [a] -> [b]
Prelude cycl e :: [a] -> [a]
Data.List ciclo :: [a] -> [a]
Preludio init :: [a] -> [a]
Data.List init :: [ a] -> [a]
Preludio revertir :: [a] -> [a]

Como se puede ver la mayoría de estas funciones se llaman algo con "mapa", que de nuevo no podría ser el nombre usted esperaba, pero aparentemente ¡así es como se llama esta operación! El que estás buscando es bastante simple.

Finalmente, necesitamos combinar esas dos funciones. map necesita otra función como primer argumento - bueno, eso obviamente es read ¡entonces! Entonces simplemente aplica map a read. El siguiente argumento es la lista de [a] s: aha, ¡ya terminamos!

Esto se puede comprobar mediante el lanzamiento hasta ghci:

Preludio>: t Mapa Leer
mapa leídos :: Lea b => [String] -> [b]

Hay sigue siendo este b aquí en lugar de Int, pero no importa que: b puede ser cualquier tipo que desee! - siempre que tenga una instancia Read. Int tiene:

Preludio>: I int
datos Int = GHC.Types.I # # GHC.Prim.Int - Definido en `GHC.Types'
ejemplo acotada Int - Definido en` GHC.Enum '
ejemplo Enum Int - Definido en `GHC.Enum'
instancia Eq Int - Definido en` GHC.Classes'
ejemplo Integral Int - Definido en `GHC.Real'
ejemplo Núm Int - Definido en `GHC.Num '
instancia Ord Int - Definido en` GHC.Classes'
instancia Leer Int - Definido en `GHC.Read '
instancia Real Int - Definido en` GHC.Real'
instancia Mostrar Int - Definido en `GHC.Mostrar'

21

Esta falla:

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

La manera de hacerlo es:

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

Fuera de GHCi, en un archivo de .hs sería:

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