如何在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
)
扩大@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
可能在您的顶级会话中存在一些无关的输入(或无关的定义)。我建议再试一次新的会议。