gpt4 book ai didi

list - 按 Elm 中的第一个索引对元组列表进行排序

转载 作者:行者123 更新时间:2023-12-04 22:56:32 25 4
gpt4 key购买 nike

假设我有一个类似于以下示例的元组列表:

[(5, "a"), (1, "c"), (7, "d")] 

在 Elm 中,我如何按第一个元素按升序对列表进行排序,以便我们得到以下结果?
[(1, "c"), (5, "a"), (7, "d")]

使用 Elm List documentation ,看来 sortBy sortWith 在这种情况下,函数将很有用。我的实现尝试如下:
maxTuples : Tuple(a, b) -> Tuple(a, b) -> Tuple(a, b)
maxTuples t1 t2 =
case compare t1 t2 of
((Tuple.first t1) >= (Tuple.first t2)) -> GT
_ -> LT


sortByFirst : List (Tuple (a, b)) -> List (Tuple (a, b))
sortByFirst lst =
List.sortWith maxTuples lst

但是,我收到以下性质的编译器错误:
I ran into something unexpected when parsing your code!

99| ((Tuple.first t1) >= (Tuple.first t2)) -> GT
^
I am looking for one of the following things:

an upper case name

我的预感是编译器正在寻找 GT/ LT/ EQ根据 List 的 API库,但如果是这种情况,我不确定我们将如何使用 sortBysortWith按每个元素的第一个索引对 Elm 中的元组列表进行排序。

最佳答案

您找到了正确的功能。在您的代码中,实际上存在多个问题:

  • 类型注释应该只是 (a, b) ,不是 Tuple(a, b) .
  • 你比较t1t2 ,这将按字典顺序比较元组。你真的想要 compare (Tuple.first t1) (Tuple.first t2)
  • case 分支在 -> 之前需要一个模式.在这种情况下将类似于 EQ ,因为您正在匹配 compare 的结果,返回 Order 类型。

  • 您可以像这样修复代码:
    maxTuples : (comparable, b) -> (comparable, b) -> (comparable, b)
    maxTuples t1 t2 =
    case compare (Tuple.first t1) (Tuple.first t2) of
    GT -> GT
    EQ -> EQ
    _ -> LT

    但是现在有一个不必要的重复,你只是返回 compare 的结果。功能。
    maxTuples t1 t2 = 
    compare (Tuple.first t1) (Tuple.first t2)

    连同 sort 函数,它看起来像这样:
    sortByFirst lst = 
    List.sortWith (\t1 t2 -> compare (Tuple.first t1) (Tuple.first t2)) lst

    事实证明,这种操作很常见,尤其是对于记录列表。为此,Elm 提供了另一个功能—— sortBy .它接受一个函数并在应用该函数后比较元素:
    sortBy f lst =
    List.sortWith (\a b -> compare (f a) (f b)) lst

    因此,您可以使用 sortBy大大简化代码的函数:
    sortByFirst : List (comparable, b) -> List (comparable, b)
    sortByFirst =
    sortBy Tuple.first

    关于list - 按 Elm 中的第一个索引对元组列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43600478/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com