如何制作一个功能。在Ocaml中,它接受两个布尔值和一个char(操作),然后返回一个相应的逻辑值

问题描述 投票:-1回答:1

如何在Ocaml中编写一个函数,它接受两个布尔值(例如a和b,表示逻辑值0和1)和一个字符,它将决定这两个逻辑值之间的操作?然后,该函数将返回true或false,具体取决于相应的逻辑值输入。

此代码中既有语义错误,也有语法错误;好吧,也许还有更多,但编译器到目前为止只对这一个抱怨:

第2行,字符27-30:错误:此表达式具有char类型,但预期表达式为bool类型

这就是编译器对代码所说的内容,这就是我写的内容:

let logic (a, b) operation = match operation with
| true -> if (operation == 'A') then match (a,b) with
      | (true, true) -> true
      | _ -> false
      else if (operation == '0') then match (a,b) with
      | (false,false) -> false
      | _ -> true
      else if (operation == 'X') then match (a,b) with
      | (true,true) -> false
      | (false,false) -> false
      | _ -> true
      else if (operation == 'I') then match (a,b) with
      | (true, false) -> false
      | _ -> true
      else then match (a,b) with
      | _ -> false

| false -> end;;

logic (a,b) 'A';;

--------------------------------------------------------------------------

好的,我已经取得了一些进展,至少它现在可以编译。但是,当我尝试使用此行调用“逻辑”函数时,我仍然会收到错误:

logic (true, false) 'A';;

错误说明了这一点:

错误:此表达式的类型为bool。这不是函数;它无法应用。

这是我现在写的:

let logic (a, b) operation = match operation with
| 'A' -> (match (a,b) with
          | (true, true) -> true
          | _ -> false
          )
| '0' -> (match (a,b) with
          | (false,false) -> false
          | _ -> true
          )
| 'X' -> (match (a,b) with
          | (true,true) -> false
          | (false,false) -> false
          | _ -> true)
| 'I' -> (match (a,b) with
          | (true, false) -> false
          | _ -> true
          )
| _ -> (match (a,b) with
        | _ -> false
        )
ocaml
1个回答
1
投票

扩大@Elan-Hamburger的评论。

你有这个:

match operation with
| true -> ...

但是你的operation是一个角色。所以这不会奏效。您只能将operation与特定字符进行匹配。

这是特别奇怪的,因为你后来使用operator==与各种角色进行比较。但这场比赛会为你做到这一点。

换句话说,你可以有这样的东西:

match operation with
| 'A' -> ...
| '0' -> ...
| 'X' -> ...
| 'I' -> ...
| _ -> ...

您的代码还有许多其他问题。以下是一些评论:

您有嵌套的匹配语句,这需要括号正确运行。如果您尝试在没有括号的情况下进行嵌套,则无法判断内部匹配何时结束,并且给出了外部匹配的其他替代方法(以|开头)。

嵌套匹配语句如下所示:

match expr with
| X ab ->
    (match ab with
    | A -> 4
    | B -> 2
    )
| Y _ -> 0

(如果您更喜欢看起来的样子,也可以使用begin / end而不是括号。)

您正在使用==来比较值。普通的等式比较运算符是=。特殊操作符==只应在具有特定原因时使用。

您的代码如下所示:

else then match ...

这在语法上是不正确的。可能then是编辑遗留下来的。

您可以简化此表达式

match (a, b) with
| _ -> false

这个简单的表达方式:

false

更新

我无法重现您新报告的问题。事实上,你的新代码在两个快速测试中对我来说没问题。

. . .
val logic : bool * bool -> char -> bool = <fun>
# logic (true, false) 'A';;
- : bool = false
# logic (true, true) 'A';;
- : bool = true

可能在您的顶级会话中存在一些无关的输入(或无关的定义)。我建议再试一次新的会议。

© www.soinside.com 2019 - 2024. All rights reserved.