Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在haskell中获得列表中的最短列表_List_Haskell_Compare - Fatal编程技术网

List 如何在haskell中获得列表中的最短列表

List 如何在haskell中获得列表中的最短列表,list,haskell,compare,List,Haskell,Compare,此函数接收列表并返回最短的列表(如果列表为空,则返回空列表) 比如说 最短[[1,2,9],[3,4],[1,2,3,5]] 将返回[3,4] 最短::[[a]]->[a] 我是哈斯克尔的新手,如果您能提供帮助,我们将不胜感激 谢谢 序曲>:m+数据列表 序曲数据.列表>:m+数据.函数 序曲数据。列表数据。函数>最小值(比较长度)[[1,2,9],[3,4],[1,2,3,5] [3,4] 它的工作原理——很明显,最小值。但我们不希望按照默认的字典顺序来比较数字列表,而是希望指定比较的确切属性

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

比如说 最短[[1,2,9],[3,4],[1,2,3,5]] 将返回[3,4]

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

我是哈斯克尔的新手,如果您能提供帮助,我们将不胜感激 谢谢

序曲>:m+数据列表
序曲数据.列表>:m+数据.函数
序曲数据。列表数据。函数>最小值(比较长度)[[1,2,9],[3,4],[1,2,3,5]
[3,4]

它的工作原理——很明显,
最小值
。但我们不希望按照默认的字典顺序来比较数字列表,而是希望指定比较的确切属性,即长度<代码>比较`打开`ᴘʀᴏᴘᴇʀᴛʏ是一个简单的记忆技巧,它使用

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
。您不应该使用它来查找数千个元素中的最短列表,每个元素有数百个。当然存在更好的算法,但它们并不那么简单和简洁

shortest [y] = y    --base case: if there's only one element left, return it.
shortest (x:y:lst)  --extract the first two elements x, y from the list.  
    | length x > length y = *recursion*  
    | otherwise = *recursion*
您可以使用递归来解决这个问题。 我基本上为您列出了结构,但是您应该考虑如何实现递归部分。记住递归是在函数调用自身时发生的

提示:使用冒号将最短的元素连接回原始列表,以便可以将其与列表中的下一个元素进行比较


希望有帮助

我想扩展@leftaroundabout提供的解决方案

Prelude Data.List Data.Function> minimumBy (compare `on` (map . const $ 1)) [[1..],[5..11],[3,4]]

与原始解决方案不同,此解决方案肯定适用于无限列表。

首先需要从Data.Ord进行比较

import Data.Ord
然后给出了通过长度进行比较的比较函数minimumBy

minimumBy (comparing (length)) [[1,2,9],[3,4],[1,2,3,5]]

您还可以使用
Data.Ord
中的
比较
功能。然后你可以做
minimumBy(比较长度)[[1,2,9],[3,4],[1,2,3,5]]
。这也几乎可以理解为简单的英语,这很好。好的观点,这是一种规范。虽然我认为“最小长度比较”,甚至更接近普通英语,而不是“通过比较长度最小”,当然它也更一般(例如,代码> NBBY((=)‘长度’< /代码>)),似乎这个问题已经有了一些好的答案。然而,在将来,有礼貌的做法是说你尝试了什么,以及在哪里和为什么你被卡住了。当然,你可以使用递归解决任何问题(或者,也不能用其他方式)。然而,当有高阶函数从您身上抽象出这个负担时,通常使用它们是一个好主意。如果您对使用
minimumBy
的超短解决方案有效率方面的顾虑,您仍然可以使用折叠,这将相当于您所指的显式递归解决方案。我理解您的顾虑。考虑到他/她是Haskell的新手,我只是认为递归是一种选择@左邻右舍。一方面,我不同意——Haskell的构建方式使得高阶函数特别易于使用,而且它们往往比显式递归更清晰、更易于重构等。OTOH,在某个时刻掌握递归方法是不可避免的,这可能比折叠更简单。至少,所以。。。好的–同意,+1.谢谢:)我同意你的观点,Haskell的高阶函数通常是方便和简洁的,我还认为递归是高阶函数的基础@左撇子!您可以缩短
map。康斯特1美元≡ map$const 1也使它更清晰。或者更好的是,
map$const()