Je débute. Et je bute sur un problème régulièrement. Impossible d'écrire une signature de fonction acceptée par GHCi.
Par exemple, la dernière fonction que j'ai écrite pour simplement résoudre une équation quadratique :
Ca fonctionne. Alors j'essaie de la faire précéder de sa signature. Celle qui me parraît logique serait :Code:
1
2
3
4
5
6
7
8
9 quadratic a b c | delta < 0 = [] | delta == 0 = [sol] | sol1<sol2 = [sol1, sol2] | otherwise = [sol2, sol1] where delta = b ^ 2 - 4.0 * a * c sol = (-b) / (2.0*a) sol1 = ((-b)+(sqrt delta))/(2.0*a) sol2 = ((-b)-(sqrt delta))/(2.0*a)
Mais non, GHCi se perd dans les inférences de type.Code:quadratic :: (Num a) => a -> a -> a -> [a]
Pas mieux avec :
Ni même :Code:quadratic :: (Floating a) => a -> a -> a -> [a]
Alors je vais interroger GHCi en tapant :t quadratic et je vois que la signature est:Code:quadratic :: a -> a -> a -> [a]
Soit mais alors qu'on dit qu'Haskell est concis, quelque chose m'échappe grandement. Je pensais que par la hiérarchie des types, il n'y avait pas à 'fouiller' dans les expressions ce qui relève de Ord, Floating, etc.Code:quadratic :: (Ord a, Floating a) => a -> a -> a -> [a]
Alors pourquoi fondamentalement je galère autant avec cet aspect basique qui est très décourageant avec tout ce que ce langage promet d'inférence. Je ne comprends toujours pas pourquoi il a fallu préciser le type le plus général de 'a' (Ord) et son plus restreint (Floating).
Merci de vos lumières. :)