list - 如何在haskell的列表中获取最短列表

标签 list haskell compare

此函数接受列表列表并返回最短的列表(如果列表列表为空,则返回空列表)

例如 最短 [[1,2,9],[3,4],[1,2,3,5]] 会返回 [3,4]

最短::[[a]] -> [a]

我是 haskell 的新手,我们将不胜感激 谢谢

最佳答案

Prelude> :m +Data.List
Prelude Data.List> :m +Data.Function
Prelude Data.List Data.Function> minimumBy (compare`on`length) [[1,2,9],[3,4],[1,2,3,5]]
[3,4]

它是如何工作的——嗯,minimum 是很明显的。但是我们不想按默认的字典顺序比较数字列表,而是想指定确切比较的属性——即长度。 compare`on`ᴘʀᴏᴘᴇʀᴛʏ 是一个简单易记的通用技巧,它使用

Data.Function.on :: (b->b->c) -> (a->b) -> a->a->c
compare :: Ord a => a -> a -> Ordering

所以 (compare`on`)Ord b => (a->b) -> a->a->Ordering,即我们得到一个比较如果我们可以提供产生可比较属性的函数,则可以为任何数据类型创建函数。在我们的例子中,它是 length

最后,我们需要使用该顺序来实际选择最小元素。起作用的函数 is Data.List.minimumBy .


请注意,此解决方案并不是很有效:它会对每个列表应用 length 多次。您不应该使用它来寻找数千个列表中的最短列表,每个列表都有数百个元素。当然存在更好的算法,但它们并不那么简单和简洁。

关于list - 如何在haskell的列表中获取最短列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19607809/

相关文章:

c++ - 如何在 C++ 和归并排序中比较字符串

Java 通过 CSV 进行过滤并查找数据中的空白

c++ - 列表、指针和局部变量

haskell - FoldMap 采用错误类型的参数?

haskell - 此 Haskell 数据构造函数示例中 `Pt' ' 的含义

在unix c中逐字节比较两张图片

list - 为什么 Scala 列表类名为::

C#: IEnumerable, GetEnumerator, 请举个简单的例子!

algorithm - 我怎样才能正确地遍历这个列表

javascript - 如何比较两个忽略数组属性中元素顺序的json?