Общий ответ на такие вопросы состоит в том, чтобы разбить задачу на части: [String] -> [Int]
выглядит как комбинация String -> Int
и [a] -> [b]
. Hoogle (по ссылке) даст вам некоторые результаты, давайте посмотрим ...
$ hoogle 'String -> Int'
Test.HUnit.Base Label :: String -> Node
Ошибка прелюдии :: [Char] -> a
Длина прелюдии :: [a] -> Int
Длина Data.List :: [a] -> Int
Data.Char digitToInt :: Char -> Int
Data.Char ord :: Char -> Int
Debug.Trace 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 => Строка -> a
Текст.Читать читать :: Читать a => Строка -> a
Data.String fromString :: IsString a => String -> a
GHC.Exts fromString :: IsString a => String -> a
Control.Monad.Trans.Error strMsg :: Error a => String -> a
Control.Monad.Error.Class strMsg :: Error a => String -> a
...
Тьфу, много мусора. Сначала мы можем удалить те из пакетов, с которыми вы не имеете ничего общего ...
Ошибка прелюдии :: [Char] -> a
Длина прелюдии :: [a] -> Int
Длина Data.List :: [a] -> Int
Data.Char digitToInt :: Char -> Int
Data.Char ord :: Char -> Int
Прелюдия читать :: Читать a => Строка -> a
Текст.Читать читать :: Читать a => Строка -> a
Data.String fromString :: IsString a => String -> a
Text.Printf printf :: PrintfType r => String -> r
error
звучит совсем не так, как вы хотите. length
нет. digitToInt
? Звучит как-то правильно - и работает на самом деле, но только с однозначными числами. read
? Возможно, не то имя, которое вы ожидали, но если подумать, то это правильно: преобразование строки во что-то более значимое (например, число) похоже на чтение некоторого текста.
Правильно, с другой стороны, Google дает нам то, что мы хотим, сразу:
$ hoogle '[a] -> [b]'
Прелюдия карта :: (a -> b) -> [a] -> [b]
Карта Data.List :: (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]
Прелюдия init :: [a] -> [a]
Data.List init :: [a] -> [a]
Прелюдия реверс :: [a] -> [a]
Как вы видите, большинство из этих функций называются как-то с «map», которое может снова не совпадать с ожидаемым вами именем - но, очевидно, именно это и называется эта операция! Тот, который вы ищете, довольно прост.
Наконец, нам нужно объединить эти две функции. map
нужна еще одна функция в качестве первого аргумента - ну, тогда, очевидно, read
! Таким образом, вы просто применяете map
к read
. Следующий аргумент - список [a]
с: ага, мы уже закончили!
Вы можете проверить это, запустив ghci:
Прелюдия>: чтение карты
читать карту :: Читать b => [String] -> [b]
Здесь все еще есть b
вместо Int
, но не берите в голову, что b
может быть любым типом, который вы хотите! - при условии, что у него есть Read
экземпляр. Int
имеет:
Прелюдия>: i Int
data Int = GHC.Types.I # GHC.Prim.Int # - определено в `GHC.Types '
Экземпляр Bounded Int - определен в `GHC.Enum '
экземпляр Enum Int - определен в `GHC.Enum '
instance Eq Int - определено в `GHC.Classes '
Экземпляр Integral Int - определен в `GHC.Real '
instance Num Int - определено в `GHC.Num '
экземпляр Ord Int - определен в `GHC.Classes '
Int. Read Int - определено в GHC.Read
Экземпляр Real Int - определен в GHC.Real
Instance Show Int - Определено в `GHC.Show '