2012-01-16 23 views

Odpowiedz

21

Można użyć

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

Tutaj używamy words podzielić "1 2 3 4 5" na spacji tak, że mamy ["1", "2", "3", "4", "5"]. Funkcja read może teraz konwertować poszczególne ciągi na liczby całkowite. Ma typ Read a => String -> a, dzięki czemu można go przekonwertować na dowolną klasę typu Read, która obejmuje Int. Z powodu zmiennej typu w typie zwracanym musimy podać powyższy typ.

W przypadku ciągu bez spacji musimy przekonwertować każdą Char na listę pojedynczych elementów. Można to zrobić, stosując do tego (:"") - String to tylko lista Char s. Następnie stosuje read znowu jak przedtem:

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

dziękuję dużo martin .. u rock .. –

8

Obsługa błędów jest pozostawiona jako ćwiczenie. (Podpowiedź: trzeba będzie inny typ zwracany).

+0

Myślę, że masz na myśli q2 = .. nie q2 :: – aelguindy

+0

Dzięki @aelguindy. – dave4420

2

Istnieje funkcja zdefiniowana w module Data.Char zwanego digitToInt. Przyjmuje znak i zwraca liczbę, o ile postać może być interpretowana jako cyfra szesnastkowa.

Jeśli chcesz użyć tej funkcji w pierwszym przykładzie, gdzie liczby oddzielone spacją, musisz unikać spacji. Można to zrobić za pomocą prostego filtra

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

Drugi przykład, gdzie cyfry, gdzie w ogóle nie rozdzielone, jest nawet łatwiej, bo nie trzeba filtr

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

Przypuszczam digitToInt jest lepszy niż przeczytać, ponieważ nie zależy od typu wyrażenia, które może być trudne (co z kolei oznacza, że ​​znalazłem ten post = P). W każdym razie, jestem nowy w haskell, więc równie dobrze mogę się pomylić =).

Powiązane problemy