ocaml - 执行微分的 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
每个元素执行函数。以下是我想问的具体问题。
Add l
这段代码实际上在模式匹配部分给了我一个错误。错误消息指出:Error: This expression has type (expression list) but an expression was expected of type (expression).
就我的理解而言,我确定那Add l
是一种expression
类型,而不是一种expression list
类型。为什么会产生此错误消息?我不确定如何在这个特定示例中执行递归。我最初的想法是每个函数应该只执行一次,否则结果将主要由
Int 0
's 或Int 1
's 组成。如果我错了,请纠正我。
非常感谢任何反馈。谢谢!
解决方案
推荐阅读
- r - R 包 gmnl 和 Rchoice 中可能存在错误?
- hibernate - 需要 Hibernate 通过非标准的 getter 和 setter 访问属性
- grafana - 从 Influxdb 中选择多个值/聚合器,不包括时间
- ios - React Native Firebase 更新到 5.0.0 ios 错误
- angular - Angular 6 中的动态水平节点/树结构
- regex - powershell中带下划线的同一个词
- mysql - 我想在我的 Springboot 项目中实现外键,但出现以下错误
- spring-webflux - 在返回值之前等待订阅循环的结束
- python - JSON 数据,TypeError:字符串索引必须是整数
- amazon-web-services - 如何根据 ECS 集群资源的可用性来伸缩 EC2 实例?