因此,我在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]]
答案 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