Ну, я дам вам ответ, но первый, обратите внимание, что тип списка, который вы предоставили нам не разрешено ....
Первый тип в каждом списке имеет тип (String, String)
, второй имеет тип Num a=>(String, a)
. Haskell не разрешает смешанные списки.
Это, как говорится, как только вы это исправить (например, изменение возрастного кортежа ("age", "2")
), у вас есть несколько вариантов:
Если вы хотите всегда значение в кортеже, начиная с «Age "можно использовать следующую
map (lookup "Age") $ theList
Это почти работает, но будет возвращать тип [Maybe String]
. Вы можете удалить Just
с помощью fromJust
, но будьте осторожны, это приведет к сбою программы, если она не существует. Более чистым подходом было бы использовать fromMaybe
, что позволит вам заполнить значение по умолчанию в случае Nothing
.
map (fromMaybe "ageless" . lookup "Age") $ theList
Если вы хотите всегда второе значение в списке, используйте
map (snd . tail) $ theList
Кроме того, программа будет вылетать, если какой-либо список не имеет двух элементов.
В «безопасном» пакете имеются безопасные версии tail
(https://hackage.haskell.org/package/safe-0.3.3/docs/Safe.html). Например, вы можете использовать
map (snd . tailDef ("", "Ageless")) $ theList
Если вы хотите извлечь кортежи из этого конкретного списка, у вас есть ответ. Если вам нужно работать с общими списками, укажите общие требования. Вы хотите получить вторую запись из каждого списка или записи, в которых есть «Возраст», или что-то еще. –
@Franky да, вы правы, я изменил '(String, Int)' to '(String, String)' – Krimson
Вы ищете что-то более сложное, чем 'map (!! 1)'? –