Подтвердить что ты не робот

Преобразование списка строк в список int

У меня есть список строк, можно ли преобразовать его в список ints?
например:

["1","2"] -> [1,2]
4b9b3361

Ответ 1

Хорошо

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

Нет

Ответ 2

Это не удается:

map read ["1","2"]
[*Exception: Prelude.read: no parse

Способ сделать это:

 map (read::String->Int) ["1","2"]
 [1,2]
 :: [Int]

Вне GHCI в файле .hs это будет:

let intList = map (read::String->Int) ["1","2"]

Ответ 3

Общий ответ на такие вопросы состоит в том, чтобы разбить задачу на части: [String] -> [Int] выглядит как комбинация String -> Int и [a] -> [b]. Hoogle (связанный) даст вам некоторые результаты для обоих, посмотрим...

$hoogle 'String → Int'
Test.HUnit.Base Label:: String → Node
Ошибка Prelude:: [ Char] → a
Длина прелюдии:: [a] → Int
Data.List length:: [a] → Int
Data.Char digitToInt:: Char → Int
Data.Char ord:: Char → Int
Трассировка Debug.Trace:: String → a → a
Network.BufferType buf_fromStr:: BufferOp a → String → a
Network.Socket send:: Socket → String → IO Int
Graphics.UI.GLUT.Callbacks.Window Char:: Char → Key
Прелюдия читается:: Читать a = > String → a
Text.Read read:: Read a = > String → a
Data.String fromString:: IsString a = > String → a
GHC.Exts fromString:: IsString a = > String → a
Control.Monad.Trans.Error strMsg:: Ошибка a = > String → a
Control.Monad.Error.Class strMsg:: Ошибка a = > String → a
...

Ух, много мусора. Мы можем сначала устранить те из пакетов, в которых вы не имеете никакого отношения...

Ошибка прелюдии:: [ Char] → a
Длина прелюдии:: [a] → Int
Data.List length:: [a] → Int
Data.Char digitToInt:: Char → Int
Data.Char ord:: Char → Int
Прелюдия читается:: Читать a = > String → a
Text.Read read:: Read a = > String → a
Data.String fromString:: IsString a = > String → a
Text.Printf printf:: PrintfType r = > String → r

error звучит не так, как хочется. length нет. digitToInt? Звучит правильно - и работает на самом деле, но только с однозначными номерами. read? Возможно, не имя, которое вы ожидали бы, но если вы подумаете об этом, это правильно: преобразование строки в нечто более значимое (например, число) похоже на чтение некоторого текста.

Справа, с другой стороны Hoogle дает нам то, что мы хотим, прямо вперед:

$hoogle '[a] → [b]'
Карта прелюдии:: (a → b) → [a] → [b]
Карта данных. Список: (a → b) → [a] → [b]
Prelude concatMap:: (a → [b]) → [a] → [b]
Data.List concatMap:: (a → [b]) → [a] → [b]
Data.Maybe mapMaybe:: (a → Возможно, b) → [a] → [b]
Цикл прелюдии:: [a] → [a]
Цикл Data.List:: [a] → [a]
Prelude init:: [a] → [a]
Data.List init:: [a] → [a]
Прелюдия reverse:: [a] → [a]

Как вы видите, большинство этих функций называются чем-то с "картой", что может и не быть именем, которое вы ожидали, но, по-видимому, это то, что называется этой операцией! Тот, который вы ищете, является самым простым.

Наконец, нам нужно объединить эти две функции. map нужна другая функция в качестве первого аргумента - ну, очевидно, read тогда! Поэтому вы просто применяете map к read. Следующий аргумент - это список [a] s: aha, мы уже сделали!

Вы можете проверить это, запустив ghci:

Прелюдия > : t map read
map read:: Read b = > [String] → [b]

Здесь все равно b вместо Int, но неважно, что: b может быть любым типом, который вы хотите! - если он имеет экземпляр read. Int имеет:

Прелюдия > : я Int
data Int = GHC.Types.I # GHC.Prim.Int # - Определено в `GHC.Types '
instance Bounded Int - Определено в `GHC.Enum '
instance Enum Int - Определено в `GHC.Enum '
instance Eq Int - Определено в `GHC.Classes '
instance Integral Int - Определено в `GHC.Real '
экземпляр Num Int - Определено в `GHC.Num '
экземпляр Ord Int - Определено в `GHC.Classes '
instance Read Int - Определено в `GHC.Read '
instance Real Int - Определено в `GHC.Real '
instance Show Int - Определено в `GHC.Show '