let rec length list =
 match list with
  [] -> 0
 | x::rest -> 1 + length rest;;

このリストの長さを返す再帰関数の動きなんですが、下へ展開していって
ループが終了したら、上に値が戻ってくるイメージでOKですか?

length [2; 1; 3] = match [2; 1; 3] with
  | 2 :: [1; 3] -> 1 +
            length [1; 3] = match [1; 3] with
              | 1 :: [3] -> 1 +
                       length [3] = match [3] with
                        | 3 :: [] -> 1 +
                                length [] = match [] with   
                                   [] -> 0
                              1 + 0        
                     1 + 1
           1 + 2
length [2; 1; 3] = 3