F# 多项式微分器

F# Polynomial Derivator

我正在编写一个程序,该程序采用多项式及其导数 return。多项式作为预定义类型 "poly" 传递,这是一个元组列表,其中第一个元素是表示系数的浮点数,第二个元素是表示该项次数的整数。所以 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

我得到的错误告诉我程序期望函数 return 类型为 poly,但这里有类型 'a * 'b。我不明白为什么会这样,在我的基本情况下我 return 一个元组,而在所有其他情况下我附加到一个累积列表中。我玩过括号,但无济于事。为什么我的代码抛出这个错误?

感谢所有关于此事的意见。

你自己说的:在基本情况下,你返回的是 tuple 而不是 list - 所以推论认为这就是你要

改成:

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

应该没问题(只需将 (..) 替换为 [..] ;))

记住:: 会在列表

中产生一个新头

floatint 存在一些问题,所以我建议这样做(使用递归):

type Poly = (float*int) list

let test : Poly =  [(2.0, 3);(1.5,2);(3.2,1);(1.0,0)]

let rec diff (p:Poly):Poly = 
    match p with
    | [] -> []
    | x::xs -> (fst x * float (snd x), snd x - 1) :: diff xs

实际上就是这样:

let diff : Poly -> Poly = 
    List.map (fun x -> fst x * float (snd x), snd x - 1)

没有 fstsnd 看起来会好很多:

let diff : Poly -> Poly = 
    List.map (fun (a,p) -> a * float p, p - 1)