Мне было предложено написать функцию, которая будет извлекать диагональ матрицы, хранящейся в виде списка списков. Первая версия заключалась в том, чтобы извлечь число, индексируя списки, но вскоре я пришел к выводу, что это не хороший алгоритм для Haskell и написал еще одну функцию:
getDiagonal :: (Num a) => [[a]] -> [a]
getDiagonal [[]] = []
getDiagonal (xs:[]) = [head xs]
getDiagonal (x:xs) = head x : getDiagonal (map tail xs)
Поскольку я только начал изучать Haskell, я не уверен, написано ли это идиоматическим способом или если он будет работать хорошо.
Итак, мой вопрос заключается в том, есть ли лучший способ извлечь диагональ из матрицы, хранящейся в таком представлении, или если нет лучшего алгоритма, который можно было бы построить, если бы матрица была представлена с использованием более высоких порядков Haskell, например алгебраических типов? Также существует ли разница в производительности между деконструкцией списка в сопоставлении с образцом (так: (x: _): xs) или с функцией головы, как показано выше?
EDIT: На самом деле больше любопытных запросов, чем домашнее задание, они не учат функциональному программированию в технических университетах здесь (что я думаю, я думаю), но я оставлю тег.