首页 > 解决方案 > “这不是记录”-尝试对列表进行排序时出错

问题描述

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

这不是一条记录,因此它没有可访问的字段!

106| { 型号 | 团队 = List.sort.map (\p -> {p | 激活 = True}) model.teams,activatedOutput = True} ^^^^^^^^^ 这个sort值是:

List comparable -> List comparable

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

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

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

标签: listsortingfunctional-programmingelm

解决方案


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

的签名sort是:

sort : List comparable -> List comparable

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

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

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

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

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

因此,如果您希望那些将显示在顶部的团队activatedTrue您可以使用它进行排序:

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

推荐阅读