2

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

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

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

我是haskell的新手,任何帮助将不胜感激谢谢

4

4 回答 4

10
于 2013-10-26T14:29:59.317 回答
5

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

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

与原始解决方案不同,这个解决方案绝对适用于无限列表。

于 2013-10-27T10:15:49.560 回答
3
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*

您可以使用递归解决此问题。我基本上为您列出了结构,但是您应该考虑如何实现递归部分。记住递归发生在函数调用自身时。

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

希望能帮助到你!

于 2013-10-26T15:31:06.357 回答
0

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

import Data.Ord

然后给出 minimumBy 按长度比较的比较函数

minimumBy (comparing (length)) [[1,2,9],[3,4],[1,2,3,5]]
于 2013-10-31T04:54:15.793 回答