2017-05-18 3 views
-2

Je suis nouveau à Haskell-programmation et dois faire quelques exercices pour mon cours de développement fonctionnel à l'université. J'ai eu la tâche de créer un type de données, appelé "terme" qui représente une fonction rationnelle. La deuxième tâche consiste à créer une méthode qui différencie le terme entré.différenciation symbolique dans Haskell

Nous avons besoin d'une solution simple et constructeurs pour: monôme, addition, multiplication, divison

Vu:

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

Edit:

L'appel de la fonction suivante retourne la dérivation corresponsing:

diff (Monom(a,b)) = if b>0 then Monom(a*b, b-1) else Monom(0,0) 

même pour:Quelqu'un peut-il me dire comment parcourir tous les éléments de la liste entrée? La fonction ci-dessus renvoie uniquement la première valeur dérivée.

J'apprécie toute aide ou indice!

+3

Eh bien d'abord vous devriez penser à ** comment vous allez représenter une fonction rationnelle ** ... –

+2

.... de telle manière qu'il contiendra toutes les informations nécessaires pour une différenciation facile .. –

+0

Vous devriez vraiment expliquez comment votre «terme» est censé représenter une fonction rationnelle; c'est assez flou. Cela ressemble plus à une représentation d'un polynôme avec des coefficients entiers. – dfeuer

Répondre

0

Haskell a un système de type extrêmement expressif. Ne le pense pas trop! Il suffit d'écrire un type qui peut simplement capturer la définition d'une fonction rationnelle. Étant donné qu'une fonction rationnelle f(x) est une fonction qui peut être écrit sous la forme p(x)/q(x) pour les polynômes p(x) et q(x), tout type de fonction rationnelle doit faire est Encompass est deux polynômes:

data Polynomial = undefined -- your HW here 

data RationalFunction = Polynomial Polynomial 

-- or 

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

Avec les directives de notre professeur nous avons obtenu ce qui suit aussi loin que maintenant: data Term = Monom (Int, Int) | Addition [Terme] dérivant Afficher; Diff: -> Terme diff (Monom (a, b)) = Monom (a * b, b-1) Notre combat consiste à ajouter la fonction de différenciation d'une somme. Pouvez-vous nous aider avec ça? – MaMa

+0

Je vois. Votre question initiale indique que vous êtes chargé de créer un type de données, mais votre commentaire indique ici que les types de données sont déjà créés, vous implémentez simplement le reste de la fonction 'diff' pour qu'il fonctionne avec toutes les valeurs de type' Term'. Je voudrais mettre à jour votre question originale, travailler sur la logique actuelle pour soustraire des fonctions rationnelles (ou le rechercher), puis poser une question plus précise concernant la syntaxe Haskell pour la façon de l'implémenter. – SamTay

0

Vous avez juste besoin d'ajouter la définition de diff. Il a déjà été défini pour l'un des deux constructeurs du type Term, Monom. Vous devez maintenant définir pour l'autre constructeur, Addition:

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

Pensez à ce que le dérivé d'un polynôme est: la somme des dérivés des termes individuels.

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

pensent maintenant sur la façon dont le polynôme ci-dessus est représenté comme une valeur Term:

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

Et enfin, comment serait représenté le dérivé?

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

Votre tâche est de remplacer ??? dans la définition de diff avec le code qui peut prendre quelque chose comme 2) et produire quelque chose comme 3).