gpt4 book ai didi

list - Haskell:删除最大列表

转载 作者:行者123 更新时间:2023-12-01 07:06:58 25 4
gpt4 key购买 nike

我有一个列表列表,以及一个返回包含最多项目的列表的函数:

extract ::[Plateau]->Plateau

extract(x:xs)
|x==maximumBy(compare `on` length)(x:xs)=x
|otherwise = extract(xs)
extract []=[""]

现在我需要一个函数来获取相同的 [Plateau]并返回一个新的 [Plateau]删除了以前最大的:
prune::[Plateau]->[Plateau]
prune(x:xs)
|x < (maximumBy(compare `on` length)(x:xs)=x : prune (xs)
|x>=maximumBy(compare `on` length)(x:xs)=[]
prune [] = []

我也用 sortBy 调用 prune为了确保最大的列表在最后:
(extract . prune) (sortBy(compare `on` length)(plateaus))

这开始正常工作。我的列表 plateaus好像:
plateaus = ["01000"], ["01010", "11010", "10010"] ["00101"], ["01101", "01001"]]

这里是排序的:
 [["01000"], ["00101"], ["01101", "01001"], ["01010", "11010", "10010"]]

现在,我的函数 prune 正在返回一个列表
[["01000"], ["00101"]]

这告诉我,出于某种原因,Haskell 认为
["01101", "01001"] >= ["01010", "11010", "10010"]

当我可以清楚地看到 2 >= 3 不正确时。

为什么是这样?

最佳答案

像这样的东西可能是一个更简单的选择,也许:

prune :: [Plateau] -> [Plateau]
prune s@(w:x:xs) = filter ( /= maxplateau ) s
where maxplateau = maximumBy (compare `on` length) s
prune _ = []

这依赖于 Haskell 的几个不错的部分。

第一个是模式匹配——你在你的问题和上一个问题中使用了这个——在这里,我更进一步,要求一个包含至少两个元素的列表, wx .这允许失败案例处理空列表和单条目列表案例,这应该(基于您提供的代码)导致相同的事情:一个空列表。

第二种是使用 @符号,又名 as patterns .我在回答您上一个问题时向您展示了这一点。虽然只是语法糖,而不是必需的,但它可以使代码更具可读性。

三是柯里化(Currying),有时称为“部分函数应用”。就我而言,我使用了 Learn you a Haskell来电 partial application of an infix function using sections (你应该阅读整个部分 - 非常有形式,在解决 Haskell 语言的一个支柱方面做得很好(事实上,如果你真的喜欢或想要很好地掌握 Haskell 的初学者,我会阅读 Learn you a Haskell cover覆盖,因为它太棒了))。无论如何,这就是我使用的 ( /= maxplateau ) ;通常,中缀函数 /=接受两个相同类型的参数,并返回一个 Bool - 通过用括号括起来并在一侧提供表达式,我已经部分应用了它。这产生了一个 Plateau 的函数参数,非常适合提供给 Plateau 列表中的过滤函数s。

最后,在我的编辑中,我稍微更改了答案以使用 where关键词。我这样做只是为了使部分应用程序更清晰一些。我鼓励您阅读更多关于 where 的信息在 where section of Learn you a Haskell (你能说我有偏见吗?:^))

关于list - Haskell:删除最大列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7732243/

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