2016-11-05 19 views
0

これは素晴らしい例ではありませんが、私が求めていることを乗り越えるのは簡単です。再帰的にリストを再構築し、そのリストが構築された後でsort関数を適用したいとします。適切な答えを得るための実装がありますが、私はそれが好きではありません。haskellの再帰関数の定義内の再帰的にビルドされたリストに関数を適用する

import Data.List 
rebuild_and_sort :: [Int] -> [Int] 
rebuild_and_sort [] = [] 
rebuild_and_sort (b:bs) = sort (b:rebuild_and_sort bs) 

問題は、引数リストのすべての要素に対してsortが呼び出されることです。必要な引数を変更せずにリストが完全に再構築された後にのみソートが呼び出されるようにする方法はありますか?

+0

を呼びますか? –

+0

それは、私が求めていることを説明するための例にすぎず、私の頭の中で最初に起こったことでした。 – nav

+0

リストを再構築することは、あなたが取り組んでいる問題の根幹になっていますか?コンパイラはしばしば、リストのような構造の「再構築」を排除し、新しいリストを構築するのではなく元のリストを使用するだけなので、私は尋ねます。それは不変のためにこれを行うことができます。ですから、リストを再構築するためにオプティマイザを騙す方法を見つけなければならないでしょう。また、不変性のため、最初はリストを再構築する理由はありません。そのため、問題の解決策の実装方法にどのようにアプローチしているのか誤解している可能性があります。 –

答えて

4

ワーカー機能へのデリゲート再帰をして、リストを再構築したいのはなぜトップレベルでソート

import Data.List(sort) 

rbsort :: [Int] -> [Int] 
rbsort = sort . go 
    where go [] = [] 
      go (x:xs) = x: go xs -- here you should be doing something useful