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
Ce code devrait fonctionner comme suit:Je suis en difficulté de faire une fonction différenciante en OCaml (pas question de syntaxe)
diff (Times[Const 2; Var "x"], "x")
alors la sortie doit être
Times[Const 2; Const 1]
parce que si nous différencions 2x, le résultat est 2
mais l'erreur se produit et il est dit:
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
Pourquoi cette erreur se produit-elle? Je pense qu'il y a des points qui ne sont pas corrects, mais je ne trouve aucune erreur logique.
Merci de me répondre. Je me demande encore si j'ai déjà déclaré que Times -> aexp list et je pensais que cela signifiait que le constructeur Times faisait une liste de type aexp. Comment puis-je résoudre ce problème? –
@ 송재민: 'diff (Times t, var)' renvoie ou devrait retourner une somme de produits. Qui est une structure 'aexp'' Sum' avec la liste des addens à l'intérieur. Il semble non sensé d'appliquer le constructeur 'Times' à la structure' Sum'. Le résultat correct devrait être quelque chose comme 'diff (Times [u, v, w], x) = Somme [Times [u ', v, w], Times [u, Somme [Times [v', w], Times [ v, Sum [Times [w ']]]]]] '. Idéalement, les sommes et les produits à un seul élément sont déballés ... – LutzL