Ну, если вы не хотите использовать функцию сборки в map
, начиная с этого:
map :: (a -> b) -> [a] -> [b]
map f xs = [f x | x <- xs]
Чтобы принять список типов [(a, Int)]
и использовать только a
, вы можете шаблон соответствовать кортеж:
map :: (a -> b) -> [(a, Int)] -> [b]
map f xs = [f x | (x, y) <- xs]
Если вы хотите сохранить Int
, вы можете положить его обратно вместе после:
map :: (a -> b) -> [(a, Int)] -> [(b, Int)]
map f xs = [(f x, y) | (x, y) <- xs]
Но все это немного избыточно. Вы можете сделать то же самое, изменяя аргумент к оригиналу, общий map
:
map :: (a -> b) -> [a] -> [b]
map f xs = [f x | x <- xs]
mapFst :: (a -> b) -> [(a, Int)] -> [b]
mapFst f xs = map (f . fst) xs
mapOnFirst :: (a -> b) -> [(a, Int)] -> [(b, Int)]
mapOnFirst f xs = map (\(x,y) -> (f x, y)) xs
Для третьей версии, модуль Control.Arrow
стандартной библиотеки дает вам функцию, называемую first
, которую можно использовать, чтобы получить тот же эффект:
mapOnFirst :: (a -> b) -> [(a, Int)] -> [(b, Int)]
mapOnFirst f xs = map (first f) xs
Ухоженный, да?
спасибо так много, что он работает – user1131194
Если ответ помог вам, пожалуйста, нажмите на галочку рядом с ним, чтобы пометить его как принято:) – ehird