【问题标题】:Ocaml syntax match with booleanOcaml 语法与布尔值匹配
【发布时间】:2019-10-13 23:37:08
【问题描述】:

我是 Ocaml 的初学者,我似乎无法理解这种语法。 我必须编写一个不返回布尔值否定的函数。

这是我写的:

let not x = 
    match x with
      true -> false
    | false -> true;


if (not false) then  Printf.printf "True !" 

但它拒绝编译,谁能给我一个提示?

错误信息是:

Error: This expression has type unit but an expression was expected of type bool 在最后一行。

【问题讨论】:

  • 尝试使用两个分号来关闭not 声明?
  • 天哪!谢谢 !我如何在你的答案上加上绿旗?
  • 这只是一个猜测,所以我发表了评论。现在我还创建了一个您可以接受的答案

标签: syntax compiler-errors ocaml


【解决方案1】:

根据https://baturin.org/docs/ocaml-faq/#the-double-semicolon,在交互式REPL中你需要使用;;来结束你的语句:

let not x = 
    match x with
      true -> false
    | false -> true;;
(*                 ^^ *)

if (not false) then  Printf.printf "True !";;

在源代码中,您应该只使用声明,并且可以省略任何分号(感谢@glennsl):

let not x = 
    match x with
      true -> false
    | false -> true

let () = if (not false) then  Printf.printf "True !" (*
^^^^^^^^ *)

【讨论】:

  • 这实际上解决了问题,谢谢。然而,上面可能重复的帖子说分号在代码中是无用的,只能在顶层使用。我有点迷路了。
  • 如果你有一个正在编译的源代码文件,afaik 你可以完全省略分号,它仍然可以区分各个声明。
  • 这就是问题所在,我不是在顶层输入这个。并且代码没有双分号将无法编译,现在它可以正确编译并运行!
  • 是的,我也不完全理解这种行为。我所知道的是,单个 ; 是分隔表达式中多个副作用的序列运算符。
  • 这是因为if ... 是一个表达式,而不是一个定义。如果您不将该表达式与前一个表达式分开,编译器会认为它们都是单个表达式的一部分。 ;; 是这里的分隔符。另一方面,let () = if ... 是一个定义。如果您使用它,则不需要;;
【解决方案2】:

在你的帮助下,这似乎是我打算编写的代码:

let not x = 
    match x with
      true -> false
    | false -> true


let () = 
    if (not true) then
        Printf.printf "True !\n" 
    else
        Printf.printf "False !\n"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多