"Это не запись"- ошибка при попытке сортировки списка

Я хочу отсортировать список по убыванию, но когда я использую ключевое слово.sort, я получаю сообщение об ошибке:

Это не запись, поэтому у нее нет полей для доступа!

106 | {модель | team = List.sort.map (\p -> {p | active = True}) model.teams, activOutput = True} ^^^^^^^^^ This sort значение является:

List comparable -> List comparable

Но мне нужна запись с полем карты!

Это строка, которую я изменил и с которой я хочу отсортировать список.

Submit -> 
      { model | teams = List.sort.map (\p -> {p | activated = True}) model.teams, activatedOutput = True} 

1 ответ

Решение

.sort это не ключевое слово, это функция внутри List модуль. Существует несколько типов функции сортировки.

Подпись sort является:

sort : List comparable -> List comparable

Это означает, что значения в самих списках должны быть comparable что имеет особое значение в вязе. В частности, сопоставимы только встроенные вещи, такие как числа и строки. Пользовательские типы не сравнимы и не являются булевыми.

Может показаться странным слышать, что логические выражения не соответствуют comparable классификация, но рассмотрим это: что значит задать вопрос, это True больше или меньше чем False в каждом сценарии? Скорее, вам придется придумать собственное определение того, как сортировать свой пользовательский объект.

И для этого мы можем использовать List.sortBy функция, которая имеет эту подпись:

sortBy : (a -> comparable) -> List a -> List a

Это может отсортировать список чего угодно, если вы предоставите функцию, которая определяет, как сортировать объект.

Так что, если вы хотите, чтобы эти команды activated является True чтобы отображаться сверху, вы можете использовать это для сортировки:

List.sortBy (\x -> if x.activated then 0 else 1) model.teams

Тогда как, если вы хотите команды, где activated является False чтобы быть на вершине, вы можете использовать это:

List.sortBy (\x -> if x.activated then 1 else 0) model.teams
Другие вопросы по тегам