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

时间:2019-04-13 01:59:59

标签: ocaml

我如何在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';;

1 个答案:

答案 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

您的顶级会话中可能有一些多余的输入(或多余的定义)。我建议重新尝试一下。