function - 有人可以帮我把这个函数翻译成 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
递归函数;虽然可以使用 this 定义递归函数,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
这不太符合人体工程学。
推荐阅读
- curl - How does Gutenberg(org) determine scraping?
- javascript - 窗口未定义?
- swift - 如何在谷歌地图中快速取消选择标记
- angular - 如何使用 IntelliJ 调试量角器测试(使用 Angular CLI ng e2e)?
- python - Convertion of .ply format to .pcd format
- javascript - 如何从 cloudinary react 小部件访问全局范围
- sql-server - 如何加入 2 个具有子查询的表?
- python - How to use google python oauth libraries to implement OpenID Connect?
- mysql - 存储过程在 MSSQL 到 MySQL
- r - 在 R 中编写更简单的 tryCatch 版本