[英]Ocaml Abstract Sytnax Tree
我有工作表達式,但是當我嘗試使用當前的評估函數評估我的表達式時,我收到以下錯誤 - “錯誤:此模式匹配類型為 'a * 'b 的值,但預期模式匹配類型為 args 的值”。 你能幫我解決一下嗎。
type expr = Const of int
| Var of string
| Plus of args
| Mult of args
| Minus of args
| Div of args
and args = {arg1:expr; arg2:expr};;
let rec eval = function
| Const c -> c
| Plus (f, g) -> eval f + eval g
| Minus(f, g) -> eval f - eval g
| Mult(f, g) -> eval f * eval g
| Div(f, g) -> eval f / eval g
;;
正如您所聲明的那樣,像Plus
這樣的構造函數接受帶括號的參數。 您似乎正在使用適合記錄類型的語法(帶有大括號和字段名稱)。 但是您的expr
定義中沒有記錄類型。
這是expr
類型的有效值:
Plus (Const 3, Const 8)
您的eval
函數不處理變量的計算( Var
構造函數)。 這只是一個警告,而不是錯誤,但如果您嘗試評估Var "abc"
類的內容,它將導致運行時異常。
你沒有說你在談論這些錯誤中的哪一個,但我希望這仍然有幫助。
更新
正如 Discussion.ocaml.org 上的 @CraigFe 指出的那樣,您在expr
的定義和測試用例之間存在不匹配。 您可以重寫expr
的定義,以便測試用例工作,或者您可以重寫測試用例,使其適用於您當前的expr
定義。
要匹配測試用例,您需要這樣的定義:
type expr2 =
| Const of int
| Plus of { arg1 : expr2; arg2: expr2 }
然后你可以有一個這樣的值:
Plus { arg1 = Const 3; arg2 = Const 8 }
但是,在 OCaml 中不能有以大寫字母開頭的字段名稱。 這意味着Arg1
和Arg2
需要是arg1
和arg2
。 所以我個人懷疑測試用例是需要修改的部分。
我不明白關於相互遞歸定義的部分(盡管我當然知道那些是什么)。 一般來說,我會說你最大的困難在於問題陳述,而不是你的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.