哈斯克尔的象征性差异

时间:2017-05-18 14:58:33

标签: haskell differentiation

我是Haskell编程的新手,必须为我在大学的功能开发讲座做一些练习。我得到了创建数据类型的任务,称为" term"这代表了一种理性的功能。第二项任务是创建一种区分输入术语的方法。

我们需要一个简单的解决方案和构造函数:monomial,Addition,Multiplication,divison

假设:

logging.SetBackend(backendList...)

编辑:

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

 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)

有谁能告诉我如何迭代输入列表中的所有元素?上面的函数只返回第一个派生值..

我感谢每一个帮助或提示!

2 个答案:

答案 0 :(得分:0)

Haskell有一个非常富有表现力的类型系统。不要过度思考!只需编写一个可以简单捕获有理函数定义的类型。由于有理函数f(x)是一个函数,可以用p(x)/q(x)形式写成多项式p(x)q(x),所有你理性函数类型需要做的就是包含两个多项式:

data Polynomial = undefined -- your HW here

data RationalFunction = Polynomial Polynomial

-- or

data RationalFunction = { numerator :: Polynomial
                        , denominator :: Polynomial
                        }

答案 1 :(得分:0)

您只需要添加diff的定义即可。它已经为Term类型Monom的两个构造函数之一定义。您现在需要为其他构造函数Addition定义它:

diff (Monom (a, b)) = Monom (a*b, b-1)
diff (Addition terms) = ???

考虑多项式的导数是什么:各个项的导数之和。

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

现在考虑上面的多项式如何表示为Term值:

2)Addition [Monom (1,2), Monom (1, 1)] -- x^2 + x

最后,衍生物将如何表示?

3)Addition [Monom(2, 1), Monom (1, 0)] -- 2*x + 1

您的任务是将???的定义中的diff替换为可能类似于2的代码,并生成类似于3的内容。