F #: как преобразовать выражение в строку - PullRequest
0 голосов
/ 21 сентября 2018

Здравствуйте, у меня проблемаформат.Например, он может отформатировать 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 #

1 Ответ

0 голосов
/ 05 октября 2018

Проблема гласит:

[...], хотя для нее не требуется аргумент среды [...]

, поэтому ваша функция toString должна выглядеть как-тонапример:

let rec toString e =
    match e with
    | CstI i            -> sprintf "%i" i // format number as string
    | Var  x            -> x              // already a string
    | Prim("+", e1, e2) -> sprintf "(%s + %s)" (toString e1) (toString e2)
    | Prim("*", e1, e2) -> sprintf "(%s * %s)" (toString e1) (toString e2)
    | Prim("-", e1, e2) -> sprintf "(%s - %s)" (toString e1) (toString e2)

Для вложенных выражений toString сначала вызывается для подвыражений.Полученные строки затем вставляются в %s в sprintf.

...