首页 > 解决方案 > 有人可以帮我把这个函数翻译成 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' 的等价物。

标签: functionrecursionocamlsmlsmlnj

解决方案


您可以按照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.

  • 用于模式匹配的匿名函数以及只接受参数的匿名函数fnfunction(OCaml 具有functionfun作为匿名函数的语法便利,而 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
    

    这不太符合人体工程学。


推荐阅读