F#多项式导数
我正在写一个程序,它接受一个多项式并返回它的导数。多项式作为预定义类型“poly”传递,这是一个元组列表,其中第一个元素是表示系数的浮点,第二个元素是表示该项次数的整数。因此,一个多边形p=[(2.0,3);(1.5,2);(3.2;1)]代表2x^3+1.5x^2+3.2x^1。我的代码如下:F#多项式导数,f#,typeerror,derivative,F#,Typeerror,Derivative,我正在写一个程序,它接受一个多项式并返回它的导数。多项式作为预定义类型“poly”传递,这是一个元组列表,其中第一个元素是表示系数的浮点,第二个元素是表示该项次数的整数。因此,一个多边形p=[(2.0,3);(1.5,2);(3.2;1)]代表2x^3+1.5x^2+3.2x^1。我的代码如下: let rec diff (p:poly):poly = match p with | [] -> raise EmptyList | [a]-> (fst a * s
let rec diff (p:poly):poly =
match p with
| [] -> raise EmptyList
| [a]-> (fst a * snd a, snd a - 1)
| x::xs -> ((fst x * snd x), (snd x - 1)) :: diff xs
我得到的错误告诉我程序希望函数返回poly类型,但这里有'a*'b类型。我不明白为什么会这样,在我的基本情况下,我返回一个元组,而在所有其他情况下,我附加到一个累加列表中。我一直在玩括号,没用。为什么我的代码会抛出这个错误
对此事的所有意见均表示感谢 你自己说的:在基本情况下,你返回的是一个元组,而不是一个列表,因此推理认为这就是你想要的 把它改成:
let rec diff (p:poly):poly =
match p with
| [] -> raise EmptyList
| [a]-> [fst a * snd a, snd a - 1]
| x::xs -> ((fst x * snd x), (snd x - 1)) :: diff xs
它应该很好(只需将(..)
替换为[…]
;)
记住::
将把一个新的头添加到列表中
与
int
相比,float
存在一些问题,因此我建议这样做(使用递归):
这实际上就是:
let diff : Poly -> Poly =
List.map (fun x -> fst x * float (snd x), snd x - 1)
如果不使用fst
和snd
,外观会更好:
let diff : Poly -> Poly =
List.map (fun (a,p) -> a * float p, p - 1)
等等,还有一些问题(float vs int)-我正在清理它
let diff : Poly -> Poly =
List.map (fun (a,p) -> a * float p, p - 1)