有人可以帮我把这个函数翻译成 sml 吗?
Can someone help me to translate this function into sml?
我试过翻译这段 OCaml 代码
type bool_expr =
| Var of string
| Not of bool_expr
| And of bool_expr * bool_expr
| Or of bool_expr * bool_expr;
let rec eval val_vars = function
| Var x -> List.assoc x val_vars
| Not e -> not(eval val_vars e)
| And(e1, e2) -> eval val_vars e1 && eval val_vars e2
| Or(e1, e2) -> eval val_vars e1 || eval val_vars e2
这就是我所做的
datatype bool_expr = Var of string
| Not of bool_expr
| And of bool_expr * bool_expr
| Or of bool_expr * bool_expr;
And(Or(Var "a", Var "b"), And(Var "a", Var "b"));
val rec eval vars =
fn Var x => List.assoc x vars
| Not e => not(eval vars e)
| And(e1, e2) => eval vars e1 andalso eval vars e2
| Or(e1, e2) => eval vars e1 orelse eval vars e2
我在这一行遇到了关于 vars 的错误:'val rec eval vars =',我不知道 SML 中 'List.assoc' 的等价物。
您可以按照Comparing Objective Caml and Standard ML.
将OCaml翻译成SML
这是一次尝试:
datatype bool_expr =
Var of string
| Not of bool_expr
| And of bool_expr * bool_expr
| Or of bool_expr * bool_expr
exception NotFound
fun lookup x [] = raise NotFound
| lookup x ((y,v)::rest) =
if x = y
then v
else lookup x rest
fun eval val_vars = fn
Var x => lookup x val_vars
| Not e' => not (eval val_vars e')
| And (e1, e2) => eval val_vars e1 andalso eval val_vars e2
在 SML 中,您希望执行以下操作:
使用datatype
关键字定义代数数据类型,而不是OCaml的type
.
使用 fn
而不是 function
用于模式匹配的匿名函数,以及只接受参数的匿名函数。 (OCaml 有 function
和 fun
作为匿名函数的语法便利,而 SML 只有 fn
。)
在列出构造函数或模式匹配时,不要在第一个 case 前面添加 |
。
&&
称为 andalso
,||
称为 orelse
。 (请注意,and
的含义有所不同。)
没有List.assoc
所以你必须去
没有Not_found
例外所以你必须做到。
递归函数使用fun
代替let rec
;虽然递归函数 可以 使用 val rec
定义,但它不支持 =
的 left-hand 侧的参数,而 OCaml 支持。所以当你可以写
val rec eval = fn val_vars => fn e => case e of
Var x => lookup x val_vars
| Not e' => not (eval val_vars e)
| And (e1, e2) => eval val_vars e1 andalso eval val_vars e2
| Or (e1, e2) => eval val_vars e1 orelse eval val_vars e2
这不太符合人体工学。
我试过翻译这段 OCaml 代码
type bool_expr =
| Var of string
| Not of bool_expr
| And of bool_expr * bool_expr
| Or of bool_expr * bool_expr;
let rec eval val_vars = function
| Var x -> List.assoc x val_vars
| Not e -> not(eval val_vars e)
| And(e1, e2) -> eval val_vars e1 && eval val_vars e2
| Or(e1, e2) -> eval val_vars e1 || eval val_vars e2
这就是我所做的
datatype bool_expr = Var of string
| Not of bool_expr
| And of bool_expr * bool_expr
| Or of bool_expr * bool_expr;
And(Or(Var "a", Var "b"), And(Var "a", Var "b"));
val rec eval vars =
fn Var x => List.assoc x vars
| Not e => not(eval vars e)
| And(e1, e2) => eval vars e1 andalso eval vars e2
| Or(e1, e2) => eval vars e1 orelse eval vars e2
我在这一行遇到了关于 vars 的错误:'val rec eval vars =',我不知道 SML 中 'List.assoc' 的等价物。
您可以按照Comparing Objective Caml and Standard ML.
将OCaml翻译成SML这是一次尝试:
datatype bool_expr =
Var of string
| Not of bool_expr
| And of bool_expr * bool_expr
| Or of bool_expr * bool_expr
exception NotFound
fun lookup x [] = raise NotFound
| lookup x ((y,v)::rest) =
if x = y
then v
else lookup x rest
fun eval val_vars = fn
Var x => lookup x val_vars
| Not e' => not (eval val_vars e')
| And (e1, e2) => eval val_vars e1 andalso eval val_vars e2
在 SML 中,您希望执行以下操作:
使用
datatype
关键字定义代数数据类型,而不是OCaml的type
.使用
fn
而不是function
用于模式匹配的匿名函数,以及只接受参数的匿名函数。 (OCaml 有function
和fun
作为匿名函数的语法便利,而 SML 只有fn
。)在列出构造函数或模式匹配时,不要在第一个 case 前面添加
|
。&&
称为andalso
,||
称为orelse
。 (请注意,and
的含义有所不同。)没有
List.assoc
所以你必须去没有
Not_found
例外所以你必须做到。递归函数使用
fun
代替let rec
;虽然递归函数 可以 使用val rec
定义,但它不支持=
的 left-hand 侧的参数,而 OCaml 支持。所以当你可以写val rec eval = fn val_vars => fn e => case e of Var x => lookup x val_vars | Not e' => not (eval val_vars e) | And (e1, e2) => eval val_vars e1 andalso eval val_vars e2 | Or (e1, e2) => eval val_vars e1 orelse eval val_vars e2
这不太符合人体工学。