F#多项式导数

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

我正在写一个程序,它接受一个多项式并返回它的导数。多项式作为预定义类型“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 * 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)