有人可以帮助我将此功能转换为sml吗?

时间:2020-10-20 22:33:45

标签: function recursion ocaml sml smlnj

我尝试翻译此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'的等效内容。

1 个答案:

答案 0 :(得分:1)

您可以按照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具有functionfun作为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
    

    这不太符合人体工程学。