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
应该没问题(只需将 (..)
替换为 [..]
;))
记住:::
会在列表
中产生一个新头
float
与 int
存在一些问题,所以我建议这样做(使用递归):
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)
没有 fst
和 snd
看起来会好很多:
let diff : Poly -> Poly =
List.map (fun (a,p) -> a * float p, p - 1)
我正在编写一个程序,该程序采用多项式及其导数 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
应该没问题(只需将 (..)
替换为 [..]
;))
记住:::
会在列表
float
与 int
存在一些问题,所以我建议这样做(使用递归):
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)
没有 fst
和 snd
看起来会好很多:
let diff : Poly -> Poly =
List.map (fun (a,p) -> a * float p, p - 1)