Создание калькулятора OCaml. Вопросы по env - PullRequest
0 голосов
/ 24 апреля 2020
type exp = X | INT of int
         | REAL of float
         | ADD of exp * exp
         | SUB of exp * exp
         | MUL of exp * exp
         | DIV of exp * exp
         | SIGMA of exp * exp * exp

exception Error 

let rec calculate t =
  let rec eval expr env = 
    match (expr,env) with 
    | (X, []) -> raise Error
    |(X,hd::tl) -> hd
    |(INT i, _) -> float_of_int i
    |(REAL r, _) -> r 
    |ADD (n1,n2), env -> 
        let m1 = eval n1 env in
        let m2 = eval n2 env in
        m1 +. m2
    |SUB (n1,n2), env -> 
        let m1 = eval n1 env in
        let m2 = eval n2 env in
        m1 -. m2
    |MUL (n1,n2), env -> 
        let m1 = eval n1 env in
        let m2 = eval n2 env in
        m1 *. m2
    |DIV (n1,n2), env -> 
        let m1 = eval n1 env in
        let m2 = eval n2 env in
        m1 /. m2
    |SIGMA(n1,n2,n3), env -> 
        let m1 = eval n1 env in
        let m2 = eval n2 env in
        if m1 > m2 then raise Error
        else if (m1 = m2) then (eval n3 (m1::env))
        else (eval n3 (m1::env)) +. (eval (SIGMA (ADD (n1 , INT 1), n2, n3)) env)
  in eval exp[]

Я получаю сообщение об ошибке в конце, ошибка: это выражение имеет тип float -> float, но ожидалось выражение типа exp

Как мне изменить 'в eval exp []' ?

В ожидании вашей помощи .....

...