Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
haskell中的导数函数_Haskell - Fatal编程技术网

haskell中的导数函数

haskell中的导数函数,haskell,Haskell,我想知道这段代码中到底发生了什么。有人能告诉我主要的想法吗。我知道这是多项式的导数。但是我不知道dernxs1、dernxs(n+1)和dernxs0实际上做了什么 derN :: P -> Int -> P derN [] n = [] derPolinom :: P -> P derPolinom xs = derN xs 0 这些是递归调用。例如,derN(x:xs)0=dernxs1应理解为“一个多项式的导数,其中x为自由成员,xs为其他系数,与系数xs的多项式的

我想知道这段代码中到底发生了什么。有人能告诉我主要的想法吗。我知道这是多项式的导数。但是我不知道dernxs1、dernxs(n+1)和dernxs0实际上做了什么

derN :: P -> Int -> P
derN [] n = []


derPolinom :: P -> P
derPolinom xs = derN xs 0

这些是递归调用。例如,
derN(x:xs)0=dernxs1
应理解为“一个多项式的导数,其中
x
为自由成员,
xs
为其他系数,与系数
xs
的多项式的导数相同,从幂1开始”


此过程获取多项式的系数列表,并构建其导数的系数列表,递归地从最低次幂遍历到最高次幂。

通过一个示例,可能会有所帮助。看起来您有一个类似于
类型P=[Int]
的定义,所以我假设是这样的。让我们以多项式3x2+5x+7为例,它在这个方案中表示为
[7,5,3]

要计算此多项式的导数,我们从
derPolynom
开始:

derPolinom [7, 5, 3]
=
derN [7, 5, 3] 0
所以我们只需要调用
derN
。我们发现第一种情况符合:

derN (x:xs) 0 = derN xs 1
derN (x:xs) n = [n * x] ++ derN xs (n+1)
然后
x
7
xs
[5,3]
,因此我们将这些值替换到主体中:

derN [5, 3] 1
我们接到了另一个电话,因此我们找到了匹配的案例:

derN (x:xs) 0 = derN xs 1
derN (x:xs) n = [n * x] ++ derN xs (n+1)
这次,
x
5
xs
[3]
n
1
。再次替换:

[1 * 5] ++ derN [3] (1 + 1)
=
[5] ++ derN [3] 2
现在我们有了另一个递归调用,它匹配相同的模式,绑定
x
=
3
xs
=
[]
,和
n
=
2

[5] ++ ([2 * 3] ++ derN [] (2 + 1))
[5] ++ ([6] ++ derN [] 3)
最后我们讨论了递归的基本情况:

derN [] n = []
因此,我们执行最后一次替换:

[5] ++ ([6] ++ [])
然后求出
[5,6]
,表示多项式6x+5,实际上是3x2+5x+7的导数

您会注意到,我们只预先准备了单个元素列表,所以这一行:

derN (x:xs) n = [n * x] ++ derN xs (n+1)
可以简化为:

derN (x:xs) n = n * x : derN xs (n+1)
也可以使用高阶函数更简单地编写整个函数,以避免显式地写出递归。我们可以使用
drop
删除最后一个系数,并使用
zipWith(*)[1..]
将列表中剩余的每个数字乘以其基于1的索引(表示指数)


derN
的第二个参数似乎是跟踪“当前”术语的程度,因此当我们沿着列表咀嚼时,我们增加了程度。