2009-05-28 4 views

ответ

38

Ну

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

Нет?

+0

это сделал работа! :) tnx – pier

2

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

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

Ugh, много мусора. Мы можем сначала устранить те из пакетов, которые вы не имеете ничего общего с ...

ошибка Prelude :: [Char] -> длина
Prelude :: [а] -> Int
длиной Data.List :: [а] -> Int
Data.Char digitToInt :: Char -> Int
Data.Char ога :: Char -> Int
Prelude чтения :: Чтение => String -> а
текста. Чтение прочитано :: Читать a => String -> a
Data.String fromString :: IsString a => String -> a
Text.Printf Printf :: PrintfType г => String -> г

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

справа, на другой стороне Hoogle дает нам вещь, которую мы хотим прямо перед:

$ hoogle '[а] -> [б]
Prelude карта :: (а -> б) -> [a] -> [b]
Data.List map :: (a -> b) -> [a] -> [b]
Prelude concatMap :: (a -> [b]) - > [a] -> [b]
Data.List concatMap :: (a -> [b]) -> [a] -> [b]
Data.Maybe mapMaybe :: (a -> Возможно, b) -> [a] -> [b]
Цикл прелюдии e :: [a] -> [a]
Data.List cycle :: [a] -> [a]
Prelude init :: [a] -> [a]
Data.List init :: [ а] -> [а]
Prelude реверс :: [а] -> [а]

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

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

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

Prelude>: т карту чтения
карта чтения :: Читать б => [String] -> [б]

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

Prelude>: я Int
данных Int = GHC.Types.I # GHC.Prim.Int # - Определен в `GHC.Types'
экземпляра Int ограниченной - Определен в` GHC.Enum '
экземпляр Enum Int - Определен в `GHC.Enum'
экземпляра Eq Int - Определен в` GHC.Classes'
экземпляра Integral Int - Определен в `GHC.Real»
экземпляра Num Int - Определено в `GHC.Num '
экземпляр Ord Int - Определено в` GHC.Classes'
экземпляр Read Int - Определено в `GHC.Read '
экземпляр Real Int - Определено в` GHC.Real'
экземпляр Показать Int - Определено в `GHC.Показать»

21

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

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"] 
Смежные вопросы