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