我如何在Ocaml中编写一个函数,该函数将接受两个布尔值(例如a和b,分别表示逻辑值0和1)和一个字符,该函数将确定这两个逻辑值之间的运算?然后,根据相应的逻辑值输入,该函数将返回true或false。
此代码中既有语义上的错误,也有语法上的错误;好吧,也许还有更多,但是到目前为止,编译器仅对此抱怨:
第2行,字符27-30: 错误:此表达式的类型为char,但是期望该类型的表达式 布尔
这是编译器关于代码的陈述,这是我写的:
var faculties = ['Information Technology', 'Masscom'];
var f = document.getElementById("mybarChart");
new Chart(f, {
type: "bar",
data: {
labels: faculties,
datasets: ....
},
})
好的,我已经取得了一些进展,至少现在可以编译了。但是,当我尝试在此行中调用“逻辑”函数时,仍然出现错误:
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';;
--------------------------------------------------------------------------
错误指出:
错误:此表达式的类型为bool 这不是功能;无法应用。
这是我现在写的:
logic (true, false) 'A';;
答案 0 :(得分:1)
在@ Elan-Hamburger的评论中扩大一点。
你有这个:
match operation with
| true -> ...
但是您的operation
是一个字符。所以这行不通。您只能将operation
与特定字符进行匹配。
这特别奇怪,因为您以后使用operator
将==
与各种字符进行比较。但是比赛会帮你做到这一点。
换句话说,您可以拥有以下内容:
match operation with
| 'A' -> ...
| '0' -> ...
| 'X' -> ...
| 'I' -> ...
| _ -> ...
您的代码还有许多其他问题。这里有一些评论:
您具有嵌套的match语句,该语句需要括号才能正确计算。如果您尝试在没有括号的情况下嵌套,则无法判断内部匹配何时结束,并且无法给出外部匹配的其他替代方法(以|
开头)。
嵌套匹配语句如下:
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
您的顶级会话中可能有一些多余的输入(或多余的定义)。我建议重新尝试一下。