Elm 记录列表中的最大值

Elm 记录列表中的最大值,elm,Elm,假设我有一个elm中的记录列表: [ { id = 1, magnitude = 100 } , { id = 3, magnitude = 300 } , { id = 2, magnitude = 200 } ] 我想得到最大震级值(300)的记录。这样做的好方法是什么 给出了使用“最大值”方法的示例,但它使用了一个简单的整数列表。如何处理记录?根据@robertjlooby的建议进行更新 在elm community/list extra中,有一个名为的函数正是这样做的。例如: List

假设我有一个elm中的记录列表:

[ { id = 1, magnitude = 100 }
, { id = 3, magnitude = 300 }
, { id = 2, magnitude = 200 } ]
我想得到最大震级值(300)的记录。这样做的好方法是什么


给出了使用“最大值”方法的示例,但它使用了一个简单的整数列表。如何处理记录?

根据@robertjlooby的建议进行更新

在elm community/list extra中,有一个名为的函数正是这样做的。例如:

List.Extra.maximumBy.震级列表
原始答案

有几种方法可以实现这一点

第一种方法更为简洁,但它包括对整个列表进行排序、反转,然后取其头部

maxofield:(a->comparable)->列出a->可能是a
麦克斯菲尔德场=
List.head List a->Maybe a
麦克斯菲尔德场=
设f x acc=
行政协调会案例
没什么->只有x
仅y->如果字段x>字段y,则仅x,否则仅y
在List.foldr f Nothing中
正在使用的it示例:

列表=
[{id=1,幅值=100}
,{id=3,震级=300}
,{id=2,震级=200}]
主要=

text这是一个使用foldl和默认记录的版本:

bigger =
    let
        choose x y =
            if x.magnitude > y.magnitude then
                x
            else
                y
    in
        List.foldl choose {id = 0, magnitude = 0} items

塞巴斯蒂安的回答添加了一个任意的起始值,如果所有的震级都为负值,则可能会导致问题。我会适应的

bigger items =
    case items of 
        [] -> []
        (h :: []) -> h
        (h :: tail) ->
            let
                choose x y =
                    if x.magnitude > y.magnitude then
                        x
                    else
                        y
            in
                List.foldl choose h tail

很好,查德,谢谢。我想使用List.tail也可以-对吗?List.tail
List.tail
返回除第一个元素以外的所有元素。您可以通过包中的
last
实现它,尽管我在回答中试图避免使用外部包啊,我明白了!再次感谢。如果你要使用列表额外的软件包,你可以使用它来完成这项工作<代码>List.Extra.maximumBy.震级列表