2012-01-16 15 views

risposta

21

È possibile utilizzare

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

Qui usiamo words dividere "1 2 3 4 5" su spazio bianco in modo da ottenere ["1", "2", "3", "4", "5"]. La funzione read ora può convertire le singole stringhe in numeri interi. Ha il tipo Read a => String -> a in modo che possa effettivamente convertire qualsiasi cosa nella classe di tipo Read e che include Int. È a causa della variabile di tipo nel tipo restituito che dobbiamo specificare il tipo sopra.

Per la stringa senza spazi, è necessario convertire ogni Char in un elenco di elementi singoli. Questo può essere fatto applicando (:"") ad esso - un String è solo un elenco di Char s. Abbiamo poi applichiamo read di nuovo come prima:

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

grazie mille martin .. tu rock .. –

8

gestione degli errori viene lasciata come esercizio. (Suggerimento: avrete bisogno di un tipo di ritorno diverso.)

+0

Penso che tu intenda q2 = .. non q2 :: – aelguindy

+0

Grazie a @aelguindy. – dave4420

2

C'è una funzione definita nel modulo Data.Char chiamato digitToInt. Prende un carattere e restituisce un numero, purché il carattere possa essere interpretato come una cifra esadecimale.

Se si desidera utilizzare questa funzione nel primo esempio, dove i numeri sono separati da uno spazio, è necessario evitare gli spazi. È possibile farlo con un semplice filtro

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

Il secondo esempio, dove le cifre in cui non separati a tutti, è ancora più facile perché non c'è bisogno di un filtro

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

direi digitToInt è migliore di leggi perché non dipende dal tipo di espressione, il che potrebbe essere difficile (che a sua volta è il modo in cui ho trovato questo post = P). Ad ogni modo, sono nuovo di haskell quindi potrei anche sbagliarmi =).

0

È possibile utilizzare:

> [read [x] :: Int | x <- string] 
Problemi correlati