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]
, потому что если мы будем различать 2x, результат равен 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' со списком добавлений внутри. Кажется нечувствительным применять конструктор 'Times' к структуре' Sum'. Правильный результат должен быть чем-то вроде 'diff (Times [u, v, w], x) = Sum [Times [u ', v, w], Times [u, Sum [Times [v', w], Times [ v, Sum [Времена [ш ']]]]]] '. В идеале однокомпонентные суммы и продукты распаковываются ... – LutzL