簡體   English   中英

Ocaml 抽象語法樹

[英]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 中不能有以大寫字母開頭的字段名稱。 這意味着Arg1Arg2需要是arg1arg2 所以我個人懷疑測試用例是需要修改的部分。

我不明白關於相互遞歸定義的部分(盡管我當然知道那些是什么)。 一般來說,我會說你最大的困難在於問題陳述,而不是你的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM