Sorting 哈斯克尔分类法
如何以最简单的方式编写(或者haskell中嵌入了某种东西)函数,该函数以元组(String,Int)和Int x的参数列表为参数,并根据x值返回顶部的x元组作为列表 我想知道是否有可能写一个函数,它也接受3个参数,这是元组中文件的名称(或索引),根据它必须进行排序 让它变得非常通用的最佳解决方案是什么Sorting 哈斯克尔分类法,sorting,haskell,tuples,Sorting,Haskell,Tuples,如何以最简单的方式编写(或者haskell中嵌入了某种东西)函数,该函数以元组(String,Int)和Int x的参数列表为参数,并根据x值返回顶部的x元组作为列表 我想知道是否有可能写一个函数,它也接受3个参数,这是元组中文件的名称(或索引),根据它必须进行排序 让它变得非常通用的最佳解决方案是什么 take x $ sortBy (compare `on` fst) [("asd", 1), ...] take x从已排序列表中提取前x个项目sortBy使用作为第一个参数提供的排序函数对
take x $ sortBy (compare `on` fst) [("asd", 1), ...]
take x
从已排序列表中提取前x个项目sortBy
使用作为第一个参数提供的排序函数对作为第二个参数提供的列表进行排序(compare`on`fst)
比较每个元组的第一个值。
请注意,此示例比较每个元组的第一个值以进行排序。要按第二个值排序,请将fst
替换为snd
您可以看到,sortBy
函数非常通用,因为它允许您定义用于比较值的函数。该函数有两个参数,应该返回LT、EQ或GT中的一个。请注意,函数compare
需要从Ord
派生两个参数。可以在模块Data.function
中找到上的助手功能。功能sortBy
位于模块Data.List
中
编辑:
下面是一个完整的工作示例,它通过比较元组的第一个值对元组列表进行排序,并打印结果列表的前2个元组。请注意,我用一个等效函数替换了上例中的on
,该函数显示了on
在内部的功能
import Data.Function
import Data.List
main = print $ mySort [("foo", 1), ("bar", 2), ("baz", 3), ("quux", 4)] 2
mySort list x = take x $ sortBy (\ x y -> compare (fst x) (fst y)) list
编辑:
正如Tom Lokhorst在其评论中指出的,来自模块Data.Ord
的函数comparing
是比较上的的更可读的替代/快捷方式,因此上述内容也可以写成排序(比较fst)
注意,数据.Ord的比较
功能与比较时的功能相同。所以你也可以写sortBy(比较fst)列表
。很好,我不知道那一个。你不应该在sortBy
之前拿下
吗?mySort可能会占用无限的列表。由于base-4.8.0.0
,数据。list
提供sortOn
(在本例中:sortOn fst
)@AndreArtus如果你拿第一个,你只得到第一个x,而不是根据排序得到的前x。对无限列表进行排序实际上毫无意义!我知道你的问题可能更多是出于你自己的好奇心,但你对这些数据做了什么?排序后的列表真的是你想要的结果吗?我们不再在C country中的低级数组中来回移动元素,haskell让您可以轻松访问整个有趣的数据类型动物园,这些数据类型可能更适合于处理“排序”数据。原因是我正在学习并想知道有什么可能,排序函数是每个人都能理解的函数,因此解释起来更容易。当然我知道嵌入式类型,还在学习,谢谢