2011-11-13 10 views
8

Estoy tratando de escribir una función para aceptar una cadena de 4 números separados en blanco en una cadena, separarlos y convertirlos en enteros, y colocarlos en 4 variables enteras individuales. Sé que puedo utilizar splitWs dividirlas en una matriz de cadenas, utilice !! acceder a los elementos individuales, y algo como lo siguiente para convertir a entero:Convertir una cadena de números separados en espacios en blanco en una cadena en enteros y colocarlos en las variables

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

Pero no puedo encontrar la manera de ponerlo todos juntos.

Respuesta

0

No hay variables en Haskell, en Haskell las cadenas se representan como listas. Así

intento:

import Data.List.Utils 
nums=map read $split " " "1 2 3 4" :: [Int] 

Se puede acceder a los elementos individuales con (!!):

> nums(!!)0 
1 

HTH Chris

+0

por qué no usar '' splitWs' en lugar de dividir "" ¿? – nimi

+5

¿Por qué no utilizar ['words'] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v%3awords) en lugar de hacerlo? –

+0

'!!' es ineficaz en comparación con la coincidencia de patrones debido a 4 desplazamientos de lista frente a 1 – nponeccop

12

Utilice la función words a dividir la cadena por espacios en blanco. Entonces puede map read sobre el resultado.

Por lo tanto, una implementación sencilla sería:

readNumbers :: String -> [Int] 
readNumbers = map read . words 

Entonces, si usted necesita exactamente cuatro números, patrón de uso coincidentes:

case readNumbers string of 
    [a,b,c,d] -> ... 
    _   -> error "Expected four numbers" 
Cuestiones relacionadas