灵感来自比较列表长度
如果我想在列表列表中找到最长的列表,最简单的方法可能是:
longestList :: [[a]] -> [a]
longestList = maximumBy (comparing length)
一种更有效的方法是预先计算长度:
longest :: [[a]] -> [a]
longest xss = snd $ maximumBy (comparing fst) [(length xs, xs) | xs <- xss]
现在,我想更进一步。对于正常情况,它可能效率不高,但你能用箭头解决这个问题吗?我的想法基本上是,同时遍历所有列表,并继续步进,直到超过除最长列表之外的每个列表的长度。
longest [[1],[1],[1..2^1000],[1],[1]]
在前面的(非常人为的)示例中,您只需通过每个列表采取两个步骤,以确定该列表[1..2^1000]
是最长的,而无需确定所述列表的整个长度。我可以用箭头来完成吗?如果是这样,那怎么办?如果不是,那为什么不呢?如何实施这种方法?