type aexp =
| Const of int
| Var of string
| Power of string * int
| Times of aexp list
| Sum of aexp list
let rec diff : aexp * string -> aexp
= fun (exp, var) ->
match exp with
|Const a -> Const 0
|Var x -> if x = var then Const 1 else Var x
|Power (s, i) ->
if s = var then Times [Const i; Power (s, i - 1)] else Power (s, i)
|Times l ->
begin match l with
|h::t -> Sum ((Times (diff (h, var) :: t)) @ (h :: Times (diff (Times t, var))))
end
|Sum l ->
begin match l with
|h::t -> Sum (diff(h, var) :: diff(t, var))
end
此代碼預計爲工作如下:我有麻煩,在OCaml的製作差分功能(不是語法問題)
diff (Times[Const 2; Var "x"], "x")
那麼輸出必須
Times[Const 2; Const 1]
因爲如果我們區分2倍,結果是2
但發生錯誤,它說:
File "", line 18, characters 20-25:
Error: This variant expression is expected to have type 'a list
The constructor Times does not belong to type list
爲什麼會發生此錯誤?我認爲有些地方是錯誤的,但我找不到任何邏輯錯誤。
謝謝你回答我。 我還在懷疑,我已經宣佈Times - > aexp list ,我認爲這意味着Times構造函數會生成aexp類型的列表。 我該如何解決這個問題..? –
@송재민:'diff(Times t,var)'返回或返回產品總和。這是一個'aexp'結構'Sum',裏面有addens列表。將'Times'構造函數應用於'Sum'結構似乎是不合情理的。正確的結果應該像'diff(Times [u,v,w],x)= Sum [Times [u',v,w],Times [u,Sum [Times [v',w]五,總和[時報[W']]]]]]'。理想情況下,單元素和產品是解壓縮的... – LutzL