2012-01-16 31 views

Respuesta

21

Puede utilizar

Prelude> map read $ words "1 2 3 4 5" :: [Int] 
[1,2,3,4,5] 

Aquí se utiliza para dividir words"1 2 3 4 5" en los espacios en blanco para que podamos obtener ["1", "2", "3", "4", "5"]. La función read ahora puede convertir las cadenas individuales en enteros. Tiene el tipo Read a => String -> a por lo que realmente se puede convertir a cualquier cosa en la clase de tipo Read, y eso incluye Int. Es debido a la variable de tipo en el tipo de devolución que necesitamos especificar el tipo anterior.

Para la cadena sin espacios, necesitamos convertir cada Char en una lista de elementos individuales. Esto se puede hacer aplicando (:"") a él - un String es solo una lista de Char s. A continuación, aplicamos read de nuevo como antes:

Prelude> map (read . (:"")) "12345" :: [Int] 
[1,2,3,4,5] 
+1

muchas gracias Martin ... u rock ... –

8

El manejo de errores se deja como un ejercicio. (Pista: se necesita un tipo de retorno diferente.)

+0

Creo que te refieres q2 = .. no q2 :: – aelguindy

+0

Gracias @aelguindy. – dave4420

2

Hay una función definida en el módulo denominado Data.ChardigitToInt. Toma un carácter y devuelve un número, siempre que el personaje se pueda interpretar como un dígito hexadecimal.

Si desea utilizar esta función en su primer ejemplo, donde los números están separados por un espacio, deberá evitar los espacios. Puede hacerlo con un simple filtro

> map digitToInt $ filter (/=' ') "1 2 1 2 1 2 1" 
[1,2,1,2,1,2,1] 

El segundo ejemplo, donde los dígitos separados en los que no en todos, es aún más fácil, ya que no es necesario un filtro

> map digitToInt "1212121" 
[1,2,1,2,1,2,1] 

supongo digitToInt es mejor que lea porque no depende del tipo de expresión, lo que podría ser complicado (que a su vez es cómo encontré esta publicación = P). De todos modos, soy nuevo en Haskell así que podría estar equivocado =).

0

Se puede utilizar:

> [read [x] :: Int | x <- string] 
Cuestiones relacionadas