リストの長さを比較するに触発されました
リストのリストで最も長いリストを見つけたい場合、最も簡単な方法はおそらく次のとおりです。
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]]
前述の (非常に不自然な) 例では、各リストを 2 ステップ実行するだけで、そのリスト[1..2^1000]
が最も長いかどうかを判断でき、リスト全体の長さを判断する必要はありません。これが矢印でできるというのは正しいですか?もしそうなら、どうやって?そうでない場合、その理由は何ですか? また、このアプローチをどのように実装できますか?