Возможно, это не самый эффективный способ сделать это, но, похоже, он работает (я назвал его scanl, учитывая, что вам нужен доступ к предыдущему элементу или строке):
let scanl f s l =
List.scan (fun (acc,elem0) elem1 -> (f acc elem0 elem1),elem1) (s,List.head l) l
|> List.map fst
Примеры использование:
let l = [1..5]
scanl (fun acc elem0 elem1 -> elem0,elem1) (0,0) l
//result: [(0, 0); (1, 1); (1, 2); (2, 3); (3, 4); (4, 5)]
Обычный List.scan даст следующее:
List.scan (fun acc elem -> elem) 0 l
//result [0; 1; 2; 3; 4; 5]