Haskell中的符号微分
我是Haskell编程的新手,必须为我在大学的函数开发讲座做一些练习。我的任务是创建一个称为“term”的数据类型,它表示一个有理函数。第二项任务是创建一种区分输入术语的方法 我们需要一个简单的解决方案和构造函数:单项式,加法,乘法,除法 鉴于: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
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) = ???