Others have already explained the difference - they reduce the elements in a different order.
For most operations that you can use with reduceor reduceBack, the difference does not really matter. In more mathematical terms, if your operation is associative (for example, numerical operations, maximum, minimum or total functions, linking, etc.), then they behave the same.
, , , :
type Tree =
| Leaf of int
| Node of Tree * Tree
[ for n in 0 .. 3 -> Leaf n]
|> List.reduce (fun a b -> Node(a, b))
[ for n in 0 .. 3 -> Leaf n]
|> List.reduceBack (fun a b -> Node(a, b))
, ( , , !)
reduce reduceBack
-------------------------------------
tree: /\ /\
/\ 3 0 /\
/\ 2 1 /\
0 1 2 3
-------------------------------------
flat: 0 1 2 3 0 1 2 3