gpt4 book ai didi

F# 多项式微分器

转载 作者:行者123 更新时间:2023-12-01 17:45:26 26 4
gpt4 key购买 nike

我正在编写一个接受多项式并返回其导数的程序。多项式作为预定义类型“poly”传递,这是一个元组列表,其中第一个元素是表示系数的 float ,第二个元素是表示该项次数的整数。所以 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

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

记住::: 会把一个新的脑袋放到列表


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)

关于F# 多项式微分器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35314189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com