如果我想找到一個列表的列表最長的名單啓發比較列表長度,最簡單的方法可能是:
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)給了我相同的感覺:箭頭可以用來挖掘這些列表並存儲信息。 –
我已經接受了一個答案,但是如果有人能用箭頭來回答答案,或者徹底解釋爲什麼箭頭不相關,那麼我肯定會接受這個答案。 –