Структуры данных в функциональных языках обычно неизменяемы ;то есть они не могут быть изменены после создания.Таким образом, вы не можете выполнять замену на месте, как в итеративной реализации на основе массива.Вместо этого вам нужно написать функцию, которая принимает ваш исходный список в качестве аргумента и возвращает его независимую копию с желаемыми изменениями.
Например, посмотрите на встроенную функцию rev
.Он возвращает обратную версию любого списка, который вы передали ему, но он не изменяет (на самом деле, может не) структуру исходного списка.
В этом случае вам, вероятно, понадобитсяфункция min(xs)
для поиска наименьшего элемента x
в xs
и функция remove(x,xs)
, которая возвращает копию xs
с удаленным x
(назовем его remainder
).Затем просто рекурсивно сортируйте remainder
и добавьте x
к результату.
Вместо использования <
для сравнения элементов в min
, вы можете навязать этот необычный порядок, определив собственную функцию сравнения lessThan
, где lessThan(x,y)
всегда истинно, если x
четное и y
нечетное.
fun lessThan(x,y) = (x mod 2 = 0 and y mod 2 = 1) or (x mod 2 = y mod 2 and x < y)
Теперь просто замените любой экземпляр x < y
в вашей функции min(xs)
на lessThan(x,y)
.
Еще лучше написать версию selSort(list,comp)
, которая принимает в качестве аргумента функцию сравнения comp
.Затем вы можете передать его (op <)
, чтобы выполнить стандартную сортировку, lessThan
, чтобы выполнить эту "сортировку с изюминкой", или даже использовать ее для сортировки нецелых списков (при условии, что вы предоставляете ему функцию сравнения с соответствующим типом).).