整体运行语句时出错,但在顶层逐一运行时可以工作

时间:2019-01-15 19:31:47

标签: ocaml

因此,我在LearnOcamel中尝试了this link中的问题48,如果查看我提供的代码,则在编辑器的第二个let语句中出现“ in”关键字的语法错误。 enter image description here

如果我将第一个let语句的代码复制并粘贴到顶层,然后在顶层将第二个let语句的代码复制并粘贴,则可以正常工作。 enter image description here

这真的很奇怪。如果我尝试在顶层复制并粘贴整个代码,则将无法正常工作。 enter image description here

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 :(得分:2)

这句话

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