如果我想找到一个列表的列表最长的名单启发比较列表长度,最简单的方法可能是:
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]
是最长的,从来没有需要来确定所述列表的整个长度。我说得对,这可以用箭头来完成吗?如果是这样,那么怎么样?如果没有,那么为什么不呢,这种方法怎么可能被实施呢?
我没有看到与箭头的任何连接。 – luqui
@luqui关于[使用箭头](http://en.wikibooks.org/wiki/Haskell/Understanding_arrows#Using_arrows)上Haskell Wikibook的一部分似乎表示,箭头对于以类似于我的方式进行解析很有用提出了解决这个问题的方法(查看每个列表的第一个元素,然后是第二个元素等)[Stephen's Arrow Tutorial](http://en.wikibooks。org/wiki/Haskell/StephensArrowTutorial)给了我相同的感觉:箭头可以用来挖掘这些列表并存储信息。 –
我已经接受了一个答案,但是如果有人能用箭头来回答答案,或者彻底解释为什么箭头不相关,那么我肯定会接受这个答案。 –