Эта фраза
let table = [1;2;3] in (List.length table) |> permuteBool
является выражением верхнего уровня (глобальным). Такое выражение необходимо отделить от определений верхнего уровня двойной точкой с запятой:
let rec permuteBool n =
match n with
| 0 -> [[]]
| k -> (List.map (fun x-> true::x) (permuteBool (n-1))) @
(List.map (fun x -> false::x) (permuteBool (n-1)))
;; let table = [1;2;3] in (List.length table) |> permuteBool
Когда вы ввели две фразы по отдельности, вы в итоге случайно написали, что требовалась двойная точка с запятой ;;
, поэтому ошибка исчезла.
Более идиоматический подход состоит в том, чтобы всегда связывать такое выражение в определении верхнего уровня:
let rec permuteBool n =
match n with
| 0 -> [[]]
| k -> (List.map (fun x-> true::x) (permuteBool (n-1))) @
(List.map (fun x -> false::x) (permuteBool (n-1)))
let _ = (* here _ is used to discard the result *)
let table = [1;2;3] in (List.length table) |> permuteBool
или если вы не хотите отбрасывать результат:
let result = (* here _ is used to discard the result *)
let table = [1;2;3] in (List.length table) |> permuteBool