Haskell中的符号微分

Haskell中的符号微分,haskell,differentiation,Haskell,Differentiation,我是Haskell编程的新手,必须为我在大学的函数开发讲座做一些练习。我的任务是创建一个称为“term”的数据类型,它表示一个有理函数。第二项任务是创建一种区分输入术语的方法 我们需要一个简单的解决方案和构造函数:单项式,加法,乘法,除法 鉴于: data Term = Monom (Int, Int) | Addition[Term] deriving Show diff :: Term -> Term diff (Monom(a, b)) = Monom(a*b, b

我是Haskell编程的新手,必须为我在大学的函数开发讲座做一些练习。我的任务是创建一个称为“term”的数据类型,它表示一个有理函数。第二项任务是创建一种区分输入术语的方法

我们需要一个简单的解决方案和构造函数:单项式,加法,乘法,除法

鉴于:

 data Term = Monom (Int, Int) | Addition[Term] deriving Show
    diff :: Term -> Term
    diff (Monom(a, b)) = Monom(a*b, b-1)
编辑:

调用以下函数将返回相应的派生:

diff (Monom(a,b)) = if b>0 then Monom(a*b, b-1) else Monom(0,0)
同样适用于:

diff (Addition(x:xs)) = diff(x)
有人能告诉我如何迭代输入列表中的所有元素吗?上述函数仅返回第一个派生值


我感谢每一个帮助或暗示

哈斯凯尔有一套极具表现力的类型系统。别想太多了!只需编写一个可以简单捕获有理函数定义的类型。由于有理函数
f(x)
是一个函数,对于多项式
p(x)
q(x)
,它可以写成
p(x)/q(x)
的形式,所以有理函数类型只需要包含两个多项式:


您只需要添加到
diff
的定义中。它已经被定义为
术语
类型的两个构造函数之一,
Monom
。现在需要为另一个构造函数定义它,
Addition

diff (Monom (a, b)) = Monom (a*b, b-1)
diff (Addition terms) = ???
想想多项式的导数是什么:各个项的导数之和

1)
d/dx^2+x==2*x+1

现在想想上面的多项式如何表示为
值:

2)
加法[单体(1,2),单体(1,1)]--x^2+x

最后,导数将如何表示

3)
加法[单体(2,1),单体(1,0)]--2*x+1


您的任务是将
diff
定义中的
替换为可以接受2)和产生3)的代码。

首先,您应该考虑如何表示有理函数……以这样一种方式,它将包含易于区分所需的所有信息。您应该真正解释你的
术语
应该如何表示有理函数;这还不清楚。它看起来更像是一个整数系数多项式的表示形式。在我们教授的指导下,到目前为止,我们得到了以下结果:数据项=单项式(Int,Int)|加法[项]导出显示;diff::Term->Term diff(Monom(a,b))=Monom(a*b,b-1)我们的任务是增加求和微分的函数。你能帮我们吗?我明白了。您最初的问题说您的任务是创建一个数据类型,但您在这里的评论表明数据类型已经创建,您只是在实现函数的其余部分
diff
,以便它可以与类型
Term
的所有值一起工作。我会更新你原来的问题,计算出减去有理函数的实际逻辑(或查找),然后问一个关于Haskell语法的更精确的问题,了解如何实现它。
diff (Monom (a, b)) = Monom (a*b, b-1)
diff (Addition terms) = ???