如何解决有人可以帮助我将此功能转换为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
的匿名函数的语法便利。) -
在列出构造函数或模式匹配时,请不要在第一种情况前加
|
。 -
&&
被称为andalso
,而||
被称为orelse
。 (请注意,and
的含义有所不同。) -
没有
List.assoc
,所以您必须这样做。 -
没有
Not_found
例外,因此必须这样做。 -
对递归函数使用
fun
而不是let rec
;虽然可以使用val rec
定义递归函数 ,但这不支持=
左侧的参数,而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
这不太符合人体工程学。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。