Как преобразовать строку в список целых чисел в Haskell - PullRequest
8 голосов
/ 16 января 2012

У меня есть String, как "1 2 3 4 5". Как я могу преобразовать его в список целых чисел, таких как [1,2,3,4,5] в Haskell? Что если список будет "12345"?

Ответы [ 4 ]

22 голосов
/ 16 января 2012

Вы можете использовать

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

Здесь мы используем words, чтобы разделить "1 2 3 4 5" на пустое пространство, чтобы мы получили ["1", "2", "3", "4", "5"]. Функция read теперь может конвертировать отдельные строки в целые числа. Он имеет тип Read a => String -> a, поэтому он может конвертировать во что угодно в классе типов Read, включая Int. Именно из-за переменной типа в возвращаемом типе нам нужно указать тип выше.

Для строки без пробелов нам нужно преобразовать каждый Char в одноэлементный список. Это можно сделать, применив к нему (:"") - String - это просто список Char с. Затем мы применяем read снова, как раньше:

Prelude> map (read . (:"")) "12345" :: [Int]
[1,2,3,4,5]
8 голосов
/ 16 января 2012
q1 :: Integral a => String -> [a]
q1 = map read . words

q2 :: Integral a => String -> [a]
q2 = map (read . return)

Обработка ошибок оставлена ​​в качестве упражнения. (Подсказка: вам понадобится другой тип возврата.)

2 голосов
/ 22 декабря 2015

В модуле определена функция Data.Char , называемая digitToInt .Он принимает символ и возвращает число, если символ может быть интерпретирован как шестнадцатеричная цифра.

Если вы хотите использовать эту функцию в своем первом примере, где числа разделены пробелом, выВам нужно будет избегать пробелов.Вы можете сделать это с помощью простого фильтра

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

Во втором примере, где цифры вообще не разделены, еще проще, потому что вам не нужен фильтр

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

Я бы предположил, что digitToInt лучше, чем read , потому что это не зависит от типа выражения, что может быть сложно (что, в свою очередь, как я нашел этот пост = P).В любом случае, я новичок в haskell, поэтому могу ошибаться =).

0 голосов
/ 02 декабря 2017

Вы можете использовать:

> [read [x] :: Int | x <- string]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...