给定列表列表,如何获得最短列表?

我有

 shortest :: [[a]] -> [a]
 shortest [] = []


我真的不知道该从哪里去
感谢任何帮助

最佳答案

首先,您已经拥有的:

 shortest [] = []


我实际上不太喜欢,因为这意味着两者之间没有区别

shortest []




 shortest [[]]


但是,如果您喜欢这种行为,则Data.List具有minimumBy,其类型为

(a -> a -> Ordering) -> [a] -> a


因此,我们首先需要可以通过(a -> a -> Ordering)获得的compare和Data.Function中一个有用的小函数onon就像一个“喷嘴”,将一个函数应用于2个参数,然后再将其输入另一个函数。

 cmp = compare `on` length


这给了我们

 shortest = minimumBy cmp


但这在给定空列表时会中断,因此

  shortest [] = []
  shortest ls = minimumBy cmp ls

  shortest [] = Nothing
  shortest ls = Just $ minimumBy cmp ls

09-25 21:20