Understanding the soundness of an flambda optimization

This might seems dumb, but given your interface this would fit:

type accumulator = Obj.t list
let accumulator : accumulator = []
let apply l v = Obj.repr v :: l
let data l = Array.of_list l

What more do you need to require accumulator to be a function ?