"这不是记录" - 尝试对列表进行排序时出现错误

Col*_*rök 0 sorting functional-programming list elm

我想对我的列表进行排序,但是当我使用关键字.sort时出现错误:

这不是记录,因此没有要访问的字段!

106 | {model | teams = List.sort.map(\ p - > {p | activated = True})model.teams,activatedOutput = True} ^^^^^^^^^这个sort值是:

List comparable -> List comparable
Run Code Online (Sandbox Code Playgroud)

但我需要一张带有地图字段的记录!

这是我修改过的行,我想用它对列表进行排序.

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

Cha*_*ert 6

.sort不是关键字,它是List模块内部的一个功能.有几种类型的排序功能.

签名sort是:

sort : List comparable -> List comparable
Run Code Online (Sandbox Code Playgroud)

这意味着列表中的值必须comparable在Elm中具有特殊含义.具体来说,只有数字和字符串等内置内容才具有可比性.自定义类型无法比较,也不是布尔值.

听到布尔不符合comparable分类可能听起来很奇怪,但考虑一下:提出这个问题意味着什么,True大于或小于False每种情况?相反,您必须提出自己的定义如何对自定义对象进行排序.

为此,我们可以使用List.sortBy具有此签名的函数:

sortBy : (a -> comparable) -> List a -> List a
Run Code Online (Sandbox Code Playgroud)

这可以对任何事物的列表进行排序,只要您提供定义如何对事物进行排序的函数.

所以,如果你想在那里这些球队activatedTrue在顶部显示,你可以使用这个排序:

List.sortBy (\x -> if x.activated then 0 else 1) model.teams
Run Code Online (Sandbox Code Playgroud)

如果你想团队中虽然activatedFalse要在顶部,你可以这样做:

List.sortBy (\x -> if x.activated then 1 else 0) model.teams
Run Code Online (Sandbox Code Playgroud)