Saat ini saya sedang mengerjakan tugas pekerjaan rumah. Pada dasarnya ini adalah versi matematika simbolik yang sangat mendasar. Cuplikan kode berikut berfungsi dengan baik.
let rec eval exp (vars:(string * int) list) = match exp with
| Int n -> n
| Plus (a, b) -> (eval a vars) + (eval b vars)
(* ... more match statements ... *)
Misalnya jika saya memasukkan "eval (Plus (Int 3) (Int 5)) []" ia mengembalikan 8 dengan benar. Namun ketika saya mencoba menambahkan ekspresi "biarkan" itu memberikan kesalahan. Berikut ini cuplikan fungsi eval saya yang dimodifikasi:
(* either returns Some value or None *)
let rec findVar key l = ...
let rec eval exp (vars:(string * int) list) = match exp with
| Id id -> match (findVar id vars) with
| Some value -> value
| None -> raise (Failure ("Unknown variable " ^ id))
| Int n -> n
| Plus (a, b) -> (eval a vars) + (eval b vars)
(* ... more match statements ... *)
(* raises "Error: The variant type option has no constructor Int" *)
Saya yakin alasannya adalah kompiler melihat kode sebagai:
let rec eval exp (vars:(string * int) list) = match exp with
| Id id -> match (findVar id vars) with
| Some value -> value
| None -> raise (Failure ("Unknown variable " ^ id))
| Int n -> n
| Plus (a, b) -> (eval a vars) + (eval b vars)
(* ... more match statements ... *)
Jika intuisi saya benar bahwa ini adalah kesalahannya, bagaimana cara memperbaikinya?
Jika ada penyebab lain dari kesalahan saya, apa penyebabnya?