原著の pp.527-528 (日本語版では p.417) の
meet の定義内にある局所変数
allFields の定義がおかしいようです.
動作確認まではしておりませんが,正しくは,
let allFields =
List.map (fun li ->
if not(List.mem li labelsS) then
(li, List.assoc li fT)
else if not(List.mem li labelsT) then
(li, List.assoc li fS)
else
let tySi = List.assoc li fT in
let tyTi = List.assoc li fS in
(li, meet tySi tyTi))
allLabels in
とすべきではないでしょうか.少なくとも現状の
List.map (fun li -> if List.mem li allLabels then ...) allLabels
のようなコードは意味がないと思います.