Concurrent Clean : appendの計算量
(++)という演算子がある。これは、リストとリストを結合する演算子だ。
list1 ++ list2 [1,2,3,4] ++ [5,6,7,8]
と使う。
で、最近まで、これの計算量を間違って考えていた。
正格な言語の連想で、
[] ++ [1] ++ [2] ++ [3] ++ [4] ++ [5]
と書くよりも、
reverse [5:[4:[3:[2:[1:[]]]]]]
と書くほうが効率的だと考えていたのだが、それは間違いだった。
ところで、それに関連するが、非正格な言語では、iterativeな書き方は非効率だ。
たとえば、(++)を以下のように実装してはいけない。
(++) l1 l2 = append [] l1 l2 where append l0 [] l2 = [l0]++[l2] append l0 [l:ls] l2 = append (l0++[l]) ls l2
このように書くと、以下のようなプログラムは停止しなくなる。
Start = hd $ [0..] ++ [1]