Я предполагаю, что у вас есть навыки новичка в Хаскеле, и постараюсь лучше объяснить, что вы делаете неправильно.
lastElement :: [[a]] -> [a]
lastElement [] = error "error"
lastElement [x] = x
lastElement (x:xs) = lastElement xs
В этой функции вы получаете список элементов и возвращаете последний из них. Случается, что эти элементы тоже списки. Таким образом, применение lastElement [[1,2],[3,4]]
даст вам его последний элемент, как выглядит список [3,4]
. Поскольку вам нужно ввести список [x,y,z]
, в котором x y и z являются списками, а вы хотите вернуть [last of x, last of y, last of z]
, нам понадобятся две вещи:
1. Функция, которая получает список Int и возвращает его последний элемент
2. Применить эту функцию к (списку (спискам)) [[a]]
Чтобы сделать (1) , мы можем легко изменить вашу функцию lastElement следующим образом:
lastElement :: [a] -> a
lastElement [] = error "error"
lastElement [x] = x
lastElement (x:xs) = lastElement xs
Теперь lastElement получает один список и возвращает свой последний элемент.
Чтобы сделать (2) , нам просто нужно создать функцию отображения, подобную этой:
mapping :: ([a] -> a) -> [[a]] -> [a]
mapping _ [] = []
mapping f (x:xs) = (f x) : (mapping f xs)
Таким образом, вы можете позвонить mapping lastElement [[1,2],[3,4]]
, который даст вам [2,4]
.
Мне нужно сказать, что ничего из этого не требуется, если вы знали две последние функции, которые выполняют те же действия, что и (1) , и карту, выполняющую то же самое, что и (2) * 1039. *. Зная это, вы можете сделать как Лоренцо , уже сделанное выше:
lastElements :: [[a]] -> [a]
lastElements = map last