具体的に、どこが分からない?

let FOO = ...で関数または値FOOの定義ができること
let rec FOO =で再帰関数FOOの定義ができること
let FOO = EXPR_B in EXPR_AはEXPR_A中でbindが呼び出せること
match EXPR with X::XSはEXPRの先頭要素をX、残りをXSとして->より右の式で使えること
リストlsの先頭にeを加える操作は(e::ls)と書けること
if EXPR then X else Yは EXPRがtrueならXを、falseならYと書けること
auxはauxiliary、つまり補助関数という意味で、アキュムレータを使った末尾再帰の内部関数によくつけられる名前
aux内のaccは逆順になっているので、最後にList.revでひっくり返すという定石

これらが分かれば何をしたいのか分かる。そしてOCamlなら↑に書いてあることは全て基本事項であり、学び始めてすぐに教わること。
一方>>342の意図を汲み取るには、Javaの構文が分かっている人間であっても、

innerとは何か?対になっていそうなouterとは何か?ただの添字i,jを使わないのは何を意図しているのか?
これを理解するにはメソッドloopの中全てを読み、どこで使われ、どこで変更されているか、どこで変更されていないかを読まないといけない。
(containsは名前と引数とコードを読めば意図がすぐ読めるからいい。)
a[outer++] = a[inner]って一体何をしているのか?他にaを参照している場所は?outerが変動するのはここだけか?
最後に配列のコピーをしているのは何故か?
そういうのを全部読み取って初めて、このメソッドloopの意図
「ある整数の配列aの要素のうち、整数の集合values(ただしint[]として表現)にあるものだけを順に並べた新しい配列を返す」
が分かる。引数aがぐちゃぐちゃにされることが本質ではないこととか、最後まで確認しないと分からない。
そういう意味で可読性が低い、意図が読みづらい、と思うの。