gpt4 book ai didi

elm - 包含可能 Time.Posix 的对象的排序列表

转载 作者:行者123 更新时间:2023-12-04 10:28:05 26 4
gpt4 key购买 nike

我有一个自定义类型列表,我想对一个类型为 Maybe Time.Posix 的属性进行排序。 .在阅读文档时,我得出的结论是我应该使用 List.sortWith ,因为 May 和 Time.Posix 值都不是 comparable .我编写了一组函数来准备值,以便它们具有可比性。不过,我面临的挑战是从列表中的类型中提取值。

以下是功能:

maybeCompare : (a -> a -> Order) -> Maybe a -> Maybe a -> Order
maybeCompare f a b =
case a of
Just some_a ->
case b of
Just some_b ->
f some_a some_b
Nothing ->
GT
Nothing ->
LT

posixCompare : Time.Posix -> Time.Posix -> Order
posixCompare a b = compare (posixToMillis(a)) (posixToMillis(b))

posMay = maybeCompare (posixCompare)

我像这样组合和使用:
List.sortWith (posMay .time) objList

在看起来像这样的数据上:
obj1 = {id=1,time= Just time1}
obj2 = {id=2,time= Just time2}
obj3 = {id=3,time= Just time3}
obj4 = {id=4,time= Just time4}
obj5 = {id=5,time= Nothing}

objList = obj1 :: obj2 :: obj3 :: obj4 :: obj5 :: []

现在,这种方法适用于这样的列表 List (Maybe Time.Posix) .我的意思是我得到了我期望的输出,列表按 Posix 时间排序,在所需位置没有值。

但是,对于其中 Maybe Time.Posix 是值之一的类型列表,我收到此错误(众多错误之一,但我认为这是来源):
List.sortWith (posMay .time) objList
^^^^^
This .time field access function has type:

{ b | time : a } -> a

But `posMay` needs the 1st argument to be:

Maybe Time.Posix

有没有办法使我的函数类型对齐以对此类数据进行排序?或者,我应该重新考虑我的方法吗?

最佳答案

我在 https://ellie-app.com/8dp2qD6fDzBa1 创建了一个工作示例

您的 posMay函数类型为 Maybe a -> Maybe a -> Order ,所以它不期待 .time ,这是 {id:Int,time:Maybe Posix} -> Maybe Posix 类型的函数.

相反,您可以创建一个不同的函数,它在 posMay 之间填充和 List.sortWith ,看起来像这样:List.sortWith (\a b -> posMay a.time b.time)
如果您希望能够将 getter 函数传递给 posMay ,您可以重写它以接受该函数:

posMay getter a b =
maybeCompare posixCompare (getter a) (getter b)

然后,您可以像这样使用它: List.sortWith (posMay .time) (或 List.sortWith (posMay identity) 用于 List (Maybe Posix) 。像这样工作的版本位于 https://ellie-app.com/8dp7gm3qthka1

关于elm - 包含可能 Time.Posix 的对象的排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60550236/

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