なお、>>955の本当に意図した型は 

class ['a] mylist (l : 'a list) =
object
  method foldLeft init f = List.fold_left f init l
end

だと思うが、これはクラス定義の制限(より正確にはOCamlのlet多相性の制限)によって通らない
なので>>962のように定義してやる必要がある(そのかわりfoldLeftは多相的にならない)
一方で、こういったOCamlの型推論の制限に引っかからないように
オブジェクトを直接定義してやると多相的なfoldLeftを持つオブジェクトが得られる

let foldl collection init f = collection#foldLeft init f
let obj = object
  val lst = [1; 2; 3]
  method foldLeft init f = List.fold_left f init lst
end
let _ = foldl obj 0 (+)
let _ = foldl obj "0" (fun x y -> x ^ string_of_int y)



ま、何にしろOCamlの型推論は慣れるまで難しいな