@Kryptonit

Как поменять порядок списка на Haskell?

mylast::[a]->[a]
mylast [] = error "no elem"
mylast [z] = [z]
mylast[z,y] = [y, z]
mylast [z, y, m] = [m,y,z]
mylast (z:y:m) = mylast m

Вот код, но он не работает с количеством элементов больше 3.
Только начал изучать Haskell, прошу помочь разобраться желательно с комментариями к коду
  • Вопрос задан
  • 264 просмотра
Решения вопроса 1
includedlibrary
@includedlibrary
error здесь лишний, если перевернуть список из нуля элементов, получится список из нуля элемеентов. Ваш код неправильно работает, потому что в последней строчке вы переворачиваете хвост списка, а первые два элемента теряются.

Получаем:
mylast :: [a]->[a]
mylast [] = []
mylast [z] = [z]
mylast [z,y] = [y, z]
mylast [z, y, m] = [m,y,z]
mylast (z:y:m) = mylast m ++ [y,z]


Также можно сократить количество паттерн матчинга:
mylast :: [a]->[a]
mylast (x:xs) = mylast xs ++ [x]
mylast [] = []
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@mlyamasov
Это стандартная функция reverse из Prelude. Два варианта реализации есть тут: https://hackage.haskell.org/package/base-4.15.0.0/...
Ответ написан
Комментировать
wiz
@wiz
Ортодоксальный хаскелит
Порядок всего списка это `Data.List.reverse`.

Поменять первый с последним элементы (судя по комментарию в ответе) это совсем другая задача.
Чтобы её решить надо разбить на более простые.

Последний кейс в этом коде вовсе не делает "поменять первый и последний элемент". Но что там должно происходить?
Явно не то же самое, что вся функция в целом. Вытащите его в отдельную функцию и распишите что же именно она должна делать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы