此函数接受列表列表并返回最短的列表(如果列表列表为空,则返回一个空列表)
例如最短的 [[1,2,9],[3,4],[1,2,3,5]] 将返回 [3,4]
最短 :: [[a]] -> [a]
我是haskell的新手,任何帮助将不胜感激谢谢
我想扩展@leftaroundabout 提出的解决方案。
Prelude Data.List Data.Function> minimumBy (compare `on` (map . const $ 1)) [[1..],[5..11],[3,4]]
与原始解决方案不同,这个解决方案绝对适用于无限列表。
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*
您可以使用递归解决此问题。我基本上为您列出了结构,但是您应该考虑如何实现递归部分。记住递归发生在函数调用自身时。
提示:使用冒号将最短的元素连接回原始列表,以便您可以将其与列表中的下一个元素进行比较。
希望能帮助到你!
首先,您需要从 Data.Ord 进行比较
import Data.Ord
然后给出 minimumBy 按长度比较的比较函数
minimumBy (comparing (length)) [[1,2,9],[3,4],[1,2,3,5]]