Вы пропускаете скобки вокруг выражения then
:
if in_channel_length ic =0 then ( print_endline "Zero length file."; exit 0 );
в противном случае выражение читается синтаксическим анализатором как
(if in_channel_length ic = 0 then print_endline "Zero length file.");
exit 0;
и выход, таким образом, безоговорочный.
Обратите внимание, вам следует избегать оператора физического равенства ==
(особенно для неизменяемых значений) и использовать вместо него =
.
РЕДАКТИРОВАТЬ: Если вы хотите вернуться, вам просто нужно добавить еще ветку
if in_channel_length ic = 0 then print_endline "Zero length file."
else ....