给定列表列表,如何获得最短列表?
我有
shortest :: [[a]] -> [a]
shortest [] = []
我真的不知道该从哪里去
感谢任何帮助
最佳答案
首先,您已经拥有的:
shortest [] = []
我实际上不太喜欢,因为这意味着两者之间没有区别
shortest []
和
shortest [[]]
但是,如果您喜欢这种行为,则Data.List具有
minimumBy
,其类型为(a -> a -> Ordering) -> [a] -> a
因此,我们首先需要可以通过
(a -> a -> Ordering)
获得的compare
和Data.Function中一个有用的小函数on
。 on
就像一个“喷嘴”,将一个函数应用于2个参数,然后再将其输入另一个函数。 cmp = compare `on` length
这给了我们
shortest = minimumBy cmp
但这在给定空列表时会中断,因此
shortest [] = []
shortest ls = minimumBy cmp ls
shortest [] = Nothing
shortest ls = Just $ minimumBy cmp ls