Ошибка при выполнении оператора в целом, но работает при запуске по одному на верхнем уровне - PullRequest
0 голосов
/ 15 января 2019

Итак, я пытался задать вопрос 48 из этой ссылки в LearnOcamel, и я получил синтаксическую ошибку с ключевым словом "in" во втором операторе let в редакторе, если вы посмотрите мои предоставленные коды. введите описание изображения здесь

Если я копирую и пропускаю коды в первом операторе let верхнего уровня, а затем копирую и пропускаю код второго оператора let верхнего уровня, все работает нормально. введите описание изображения здесь

Это действительно очень странно. Если я попытаюсь скопировать и вставить все коды на верхнем уровне, это не сработает. введите описание изображения здесь

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 table = [1;2;3] in (List.length table) |> permuteBool ;;

- : bool list list =
[[true; true; true]; [true; true; false]; [true; false; true];
 [true; false; false]; [false; true; true]; [false; true; false];
 [false; false; true]; [false; false; false]]

1 Ответ

0 голосов
/ 15 января 2019

Эта фраза

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...