たとえば、ある関数はconsingを介してリストを作成します。
fun example1 _ _ [] = []
  | example1 f g (x::xs) =
    if f x
    then (g x)::(example1 f g xs)
    else x::(example1 f g xs)
末尾呼び出しアキュムレータを介してリストを作成します。
fun example2 f g xs =
    let fun loop acc [] = acc
          | loop acc (x::xs') =
            if f x
            then loop (acc@[(g x)]) xs'
            else loop (acc@[x]) xs'
    in
        loop [] xs
    end
同じ引数を指定して同じリストを作成します。
実行時間が長い関数はどれですか?
追加操作@はリストの最後までトラバースして、追加し、consingソリューションで同じ実行時間になりますが、使用するスペースがはるかに少なく、コードが少し複雑になりますか?
元の要素に変更がない場合や、既存の要素を再利用するだけの場合でも、consingまたはappendingはまったく新しい要素(オブジェクトのディープコピー)を作成しますか?
この質問は、この質問のより具体的な例を示しています