I think a more natural signature for unfold for lists is val unfold: 'a * ('a -> ('b * 'a) option) -> 'b t instead of val unfold: int * 'a * ('a -> 'b * 'a) -> 'b t The reason is that there is no reason to force the caller to know the final size, since it doesn't help unfold any (and might force the caller to do something expensive).