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听起来像是一个家庭作业。在这种情况下,我们不应该通过提供完整的解决方案来“破坏所有的乐趣”。