J'ai le code HASKELL suivant: qui donne l'erreur suivante: p> Je soupçonne que dans le triple (0, 0, 0,0) code> Les 0 sont TYPE INT code>. Est 0 code> Toujours Type int code> ou est GHCI déduire le type comme int code> dans ce cas? Si le plus tard, comment cela est-il forcer à être taper entier code> à la place? Ou y a-t-il quelque chose d'autre qui provoque cette erreur? P> P>
Doh! J'ai raté ce détail. Je revient au code que j'ai écrit un moment de retour probablement avant que j'ai appris à utiliser entier presque exclusivement.
On en est déduit, vous pouvez donc simplement modifier la signature de type de maxratio code>. Néanmoins, si vous avez besoin de changer un int code> sur un entier code>, utilisez tointère :: (intégral A) => A -> entier code> p>
J'utilise habituellement detintegeral code>, surtout lorsque j'utilise longueur code>. Y a-t-il une différence entre l'utilisation d'utiliser detintegal code> plutôt que totinteger code>?
@ Code-gourou: Je pense que la seule différence est que detintegal code> peut renvoyer n'importe quel type num code>, il est donc un peu moins clair lorsque vous le lisez quel type il va être déduit .
@ Code-Guru: En réalité, detintegal code> est défini comme detintegal = detinteger. totinteger code> - il est donc certainement juste un compromis entre la flexibilité et la lisibilité
Haskell peut généralement déduire le type de littéraux numériques tels que Cependant Votre problème est simplement que les tuples que Selon le type que vous souhaitez réellement ( Notez que l'erreur envoyée spécifiquement em> vous a dit qu'il était Haskell obtient un mauvais représentant (assez justifié) pour des messages d'erreur impénécrutables, mais cela peut aider beaucoup à partir de ce que le compilateur vous dit est le problème et essayer de déterminer 0 code> comme quel que soit le type approprié dont vous avez besoin. C'est parce que cela sait quelles fonctions vous les transmettez; Si j'ai une fonction phi :: entier -> integer code>, et j'appelle phi 0 code>, Haskell sait que ce particulier 0 code> doit avoir été un entier code>. C'est aussi bien si j'appelle une fonction pho :: int -> int code> avec pho 0 code>; que em> particulier 0 code> est déduit d'être un int code>. p>
int code> et entier code> sont des types différents, et il n'y a aucun moyen d'un 0 code> peut être transmis aux deux phi code> et pho code>. p>
maxratio code> sont saisis sont saisis (par vous) (int, int, double) code>, mais celui-ci est construit comme (n, phi n, ratio) code>. Etant donné que Phi code> prend et renvoie integer code>, le n code> dans cette expression doit être un entier code>. Mais alors cela ne fonctionne pas pour maxratio code>, vous obtenez donc l'erreur. P>
int code> ou integer code>), tout ce que vous avez à faire est de modifier la signature de type de Phi code> ou maxratio code> de sorte qu'ils travaillent avec le même type de nombre. Haskell décidera que votre 0 code> s littéralement écrit est le type numérique nécessaire pour faire ce travail, fourni em> il y en a un que peut strong> le faire fonctionner ! p>
n code> dans (n, phi n, ratio) code> qui devrait être censé être un int code> et était en réalité un entier code>. Le (0, 0, 0,0) code> tuple n'est jamais mentionné. Souvent, les erreurs de type proviennent d'une part autre que lorsque le compilateur vous indique (puisque tout le compilateur peut faire est de repérer que différentes chaînes d'inférence produisent des exigences incohérentes sur le type de quelque chose, sans aucun moyen de savoir quelle partie de l'ensemble du processus est "faux" ), mais dans ce cas, il a assez bien fait. P>
Merci pour l'explication claire. Je pensais que 0 code> était polymorphe dans son type, mais mes yeux noob ne pouvaient voir aucune autre raison de l'inférence de type qui a donné l'erreur. Bien sûr, j'ai simplement manqué ma déclaration de type explicite pour maxratio code>.
Vos signatures de type sont incohérentes - remplacez int code> avec entier code> tout au long de. p>
Voir aussi: int code> en raison du type de
maxratio code>, tandis que le type dePhi code> dit Il devrait êtreentier code>. La solution la plus simple consiste à modifier le type demaxratio code> pour utiliserinteger code> ou même justea code> car il ne touche pas ces valeurs. P >