Здравствуйте, у меня проблемаформат.Например, он может отформатировать Sub (Var "x", CstI 34) в виде строки "x - 34" .Для простоты поставьте круглые скобки вокруг любых подвыражений, даже если они лишние в соответствии со стандартными правилами приоритета для арифметических операторов.Используйте предопределенную строку функции, чтобы преобразовать целочисленное значение в его строковое представление.
Подсказка: toString имеет почти такую же структуру, что и функция eval, хотя ей не требуется аргумент среды, поскольку он использует имена переменных, а не значения переменных.
да, это HWпроблема.Любая помощь будет высоко оценена с объяснениями.Ниже я включил функцию eval
Это типы данных, которые мы использовали:
type oper1 = Neg | Not
type oper2 = Add | Mul | Sub | Less | Eq | And
type aexpr =
| C of int
| V of string
| Op1 of oper1 * aexpr
| Op2 of oper2 * aexpr * aexpr
let rec eval e (env : (string * int) list) : int =
match e with
| CstI i -> i
| Var x -> lookup env x
| Prim("+", e1, e2) -> (eval e1 env) + (eval e2 env)
| Prim("*", e1, e2) -> (eval e1 env) * (eval e2 env)
| Prim("-", e1, e2) -> (eval e1 env) - (eval e2 env)
| Prim _ -> failwith "unknown primitive"
| Let(x, e1, e2) -> eval e2 ((x, eval e1 env) :: env)
Итак, для данной проблемы я написал:
let rec toString e (env : (string * int) list) : string
match e with
| Prim("+", e1, e2) -> "e1 + e2"
| Prim("*", e1, e2) -> "e1 - e2"
| Prim("-", e1, e2) -> "e1 * e2"
это можетвыглядишь глупо, или я на правильном пути?Довольно новый для F #