たとえば、ある関数は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はまったく新しい要素(オブジェクトのディープコピー)を作成しますか?
この質問は、この質問のより具体的な例を示しています