Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/scheme/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OCaml/ML中的计算器_Ocaml_Ml_Evaluator - Fatal编程技术网

OCaml/ML中的计算器

OCaml/ML中的计算器,ocaml,ml,evaluator,Ocaml,Ml,Evaluator,我正在尝试编写一个名为eval的计算器函数。我对OCaml非常陌生,不习惯语法。我从哪里开始写这篇文章呢?在处理像您的bool\u exp这样的数据类型时,主要设备是模式匹配。也就是说,对于函数输入的每种可能情况,您都要单独指定其行为。eval函数的框架可能如下所示 type bool_exp = TT | FF | Var of string | And of bool_exp * bool_exp | Not of bool_exp ;; eval : bool_

我正在尝试编写一个名为
eval
的计算器函数。我对OCaml非常陌生,不习惯语法。我从哪里开始写这篇文章呢?

在处理像您的
bool\u exp
这样的数据类型时,主要设备是模式匹配。也就是说,对于函数输入的每种可能情况,您都要单独指定其行为。
eval
函数的框架可能如下所示

type bool_exp =
    TT
  | FF
  | Var of string
  | And of bool_exp * bool_exp
  | Not of bool_exp ;;

 eval : bool_exp -> (string -> bool) -> bool
第一个参数
e
是应该计算的表达式,第二个参数
env
通常被称为环境,它将变量(由字符串表示)映射到值(这里只是布尔常量)

只要定义的函数是递归的(即在函数体中使用自身),就需要
rec
,因为您的数据类型是递归定义的,所以
eval
也将是递归的。例如,为了评估
和(e1,e2)
您首先必须知道
e1
e2
w.r.t.在相同环境下的值


这应该可以让您开始了。

在处理像您的
bool\u exp
这样的数据类型时,主要设备是模式匹配。也就是说,对于函数输入的每种可能情况,您都要单独指定其行为。
eval
函数的框架可能如下所示

type bool_exp =
    TT
  | FF
  | Var of string
  | And of bool_exp * bool_exp
  | Not of bool_exp ;;

 eval : bool_exp -> (string -> bool) -> bool
第一个参数
e
是应该计算的表达式,第二个参数
env
通常被称为环境,它将变量(由字符串表示)映射到值(这里只是布尔常量)

只要定义的函数是递归的(即在函数体中使用自身),就需要
rec
,因为您的数据类型是递归定义的,所以
eval
也将是递归的。例如,为了评估
和(e1,e2)
您首先必须知道
e1
e2
w.r.t.在相同环境下的值


这应该可以让你开始了。

继续Chris的回答,你的函数看起来非常像:

let rec eval e env =
  match e with
    TT -> ...
  | FF -> ...
  | Var x -> ...
  | And (e1, e2) -> ...
  | Not e
;;
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 rec eval e env =
  match e with
    TT -> ...
  | FF -> ...
  | Var x -> ...
  | And (e1, e2) -> ...
  | Not e
;;
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) ;;
或者

由于类型为“eval:bool\u exp->(string->bool)->bool”,因此在使用函数之前,需要定义(string->bool)函数的用途

所以


祝您快乐函数式编程。=)

继续Chris的回答,您的函数将非常像这样:

let rec eval e env =
  match e with
    TT -> ...
  | FF -> ...
  | Var x -> ...
  | And (e1, e2) -> ...
  | Not e
;;
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 rec eval e env =
  match e with
    TT -> ...
  | FF -> ...
  | Var x -> ...
  | And (e1, e2) -> ...
  | Not e
;;
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) ;;
或者

由于类型为“eval:bool\u exp->(string->bool)->bool”,因此在使用函数之前,需要定义(string->bool)函数的用途

所以


祝您快乐函数式编程。=)

虽然你的答案肯定是正确的,但OP听起来像是家庭作业。在这种情况下,我们不应该通过提供完整的解决方案来“破坏所有的乐趣”。虽然你的答案肯定是正确的,但OP听起来像是一个家庭作业。在这种情况下,我们不应该通过提供完整的解决方案来“破坏所有的乐趣”。