type bool_exp =
TT
| FF
| Var of string
| And of bool_exp * bool_exp
| Not of bool_exp ;;
eval : bool_exp -> (string -> bool) -> bool
我正在尝试编写一个名为eval
的评估函数。我是OCaml的新手并不习惯语法。我在哪里可以写这篇文章?
答案 0 :(得分:5)
使用像bool_exp
这样的数据类型时,主要设备是模式匹配。也就是说,对于函数输入的每种可能情况,您可以单独指定其行为。 eval
函数的骨架可能看起来像
let rec eval e env =
match e with
TT -> ...
| FF -> ...
| Var x -> ...
| And (e1, e2) -> ...
| Not e
;;
第一个参数e
是应该评估的表达式,第二个env
通常称为环境,将变量(由字符串表示)映射到值(这里只是布尔常量)。
只要定义的函数是递归的(即在函数体中使用自身),就需要rec
,并且由于数据类型是递归定义的,因此eval
也是递归的。例如,为了评估And (e1, e2)
,您首先必须知道e1
和e2
w.r.t的值。相同的环境。
这应该让你开始。
答案 1 :(得分:1)
继续克里斯的回答,你的功能看起来非常像这样:
let rec eval e env =
match e with
TT -> true
| FF -> false
| Var x -> x env
| And (e1, e2) -> (eval e1 env) && (eval e2 env)
| Not e -> not (eval e env) ;;
然后在运行代码进行测试时,您将声明一个名为env的函数,如下所示:
let env y = true;;
或者...
let env y = false;;
由于类型是“eval:bool_exp - &gt;(string - &gt; bool) - &gt; bool”,因此在使用函数之前,需要定义(string - &gt; bool)的函数。< / p>
所以,
1. Declare data type bool_exp.
2. Declare that function I gave you.
3. Declare env as a function, either one you want, there's only two possible ones.
4. You can now use the function.
快乐的函数式编程给你。 =)