Thanks for the feedback - I've posted your comments to the internal F# team aliases to make sure we incorporate it.
Fold/folds on a lazy list in a strict language like F# is an interesting topic: we were discussing it at work during the week. fold_left on a lazy list becomes properly powerful (e.g. enough to define LazyList.map) if the accumulator is guaranteed to be a lazy computation (otherwise the entire lazy list must necessarily be evaluated as part of the fold, giving no chance to take the laziness of the list into the laziness of the accumulation). A sample signature of a lazy-preserving fold is:
val lazy_fold_left : (Lazy<'b> -> 'a -> 'b) -> 'b -> LazyList<'a> -> Lazy<'b>
rather than the all-too-strict:
val fold_left : ('b -> 'a -> 'b) -> 'b -> LazyList<'a> -> 'b
Try defining LasyList.map with the second and you'll see what I mean (it can't be done), though using the first to do so is no piece of cake.
(forgive me for the lack of full examples and explanation, or if I've made mistakes! Late at night over here :-) Navigating the lazy divide in a strict language is, however, a fascinating topic!)
Don