OCaml / ML中的评估员

时间:2014-01-19 18:40:40

标签: ocaml ml evaluator

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的新手并不习惯语法。我在哪里可以写这篇文章?

2 个答案:

答案 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),您首先必须知道e1e2 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.

快乐的函数式编程给你。 =)