«Это не запись» - ошибка при попытке сортировки списка - PullRequest
0 голосов
/ 26 февраля 2019

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

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

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

List comparable -> List comparable

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

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

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

1 Ответ

0 голосов
/ 27 февраля 2019

.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
...