首页 > 解决方案 > 执行微分的 OCaml 函数

问题描述

我目前正在学习 OCaml 语言,当我遇到一个我似乎无法理解的问题时,我正在解决一个练习问题。这是问题:


“编写一个函数differentiate : expression * string -> expression,接收一个代数方程和一个字符串作为参数,并返回参数方程的微分版本。

例如,diff (Add [Mult [Int 3 ; Exp("x", 2)] ; Mult [Int 6 ; Variable "x"], "x")应该产生结果:

Add [Mult [Int 6 ; Variable "x"] ; Int 6]"


这是我写的代码:

type expression =
  | Int of int
  | Variable of string
  | Exponent of string * int
  | Mult of expression list
  | Add of expression list


let rec differentiate : expression * string -> expression
= fun (exp, x) ->
  match exp with
  | Int a -> Int 0
  | Variable a -> if (a = x) then Int 1 else Variable a
  | Exponent (a, b) -> if (a = x) then
                      match b with
                      | 2 -> Mult [Int 2; Variable a]
                      | _ -> Mult [Int b; Exponent (a, b - 1)]
                    else Int 0
  | Mult [Int a; Int b] -> Const (a * b)
  | Mult (Int a::[Variable b]) -> Mult (Int a::[differentiate (Variable b, x)])
  | Mult (Int a::[Exponent (e1, e2)]) -> Mult (Int a::[differentiate (Exponent (e1, e2), 
x)])
  | Mult (Int a::[Mult (Int b :: l)]) -> Mult (Int (a * b) :: l)
  | Add l -> match l with
             | [] -> l
             | hd::tl -> Add ((differentiate (hd, x)) :: tl)
;;


我的算法基本上是执行严格的模式匹配。更具体地说,对于Mult,第一个元素始终是整数,因此我对第二个元素进行了模式匹配。对于Add,我的计划是编写函数,以便它对differentiate每个元素执行函数。以下是我想问的具体问题。

  1. Add l这段代码实际上在模式匹配部分给了我一个错误。错误消息指出:Error: This expression has type (expression list) but an expression was expected of type (expression).就我的理解而言,我确定那Add l是一种expression类型,而不是一种expression list类型。为什么会产生此错误消息?

  2. 我不确定如何在这个特定示例中执行递归。我最初的想法是每个函数应该只执行一次,否则结果将主要由Int 0's 或Int 1's 组成。如果我错了,请纠正我。


非常感谢任何反馈。谢谢!

标签: ocamldifferentiation

解决方案


推荐阅读