Dans l'extrait suivant, vous pouvez voir mes deux fonctions Collatz que j'ai écrites à Haskell. Pour l'application récursive, j'ai utilisé des parenthèses dans le premier exemple (Collatz) pour obtenir la bonne précision.
Comme je viens d'apprendre l'application de fonction avec $, j'ai essayé de réécrire la fonction (Collatz ') en utilisant cette chose. Cependant, je rencontre l'erreur suivante: p>
ne pouvait pas correspondre à ce type attendu `[a] '' contre le type déduit `A1 -> [A1] 'dans le deuxième argument de` (:)', à savoir «Collatz» dans le premier argument de `($) ', à savoir« n: Collatz '' dans l'expression: N: Collatz '$ n `div` 2 p> BlockQuote>
True : [even $ 3 `div` 3]
4 Réponses :
ceci conduit à votre erreur-type. Le deuxième argument de Si vous voulez toujours éviter la parenthèse autour de la partie 3N + 1, vous pouvez faire quelque chose comme Le suivant p> Bien que ceux-ci ne soient pas nécessairement plus propres, alors l'original. Si vous vous demandez, le $ code> a une priorité inférieure puis
: code> (ainsi que quelque chose d'autre) afin que votre fonction analyse comme
: code> attend une liste mais vous passez à la place de la fonction Collatz. P>
(n:) code> dans le premier exemple est un sucre syntaxique pour
\ x -> n: x code> p> p> p>
notez l'expression : code> lie plus fortement que
$ code>. Considérer
1: f code> trouvé par l'analyseur; Il voit
(1: f) $ 2 code> plutôt que
1: (F $ 2) code>. p> p>
Comme @MissingNo a déclaré, c'est un problème de prévention de l'opérateur. Vous pouvez le réécrire comme celui-ci mais cela ne vous achète évidemment pas beaucoup, car vous avez toujours des parenthèses. P> P>
Étant donné que d'autres ont expliqué quel est le problème, j'ai pensé que je vais expliquer comment vous auriez pu comprendre cela par vous-même. (Enseigner à un homme de pêcher et ainsi de suite ...)
Notez cette partie du message d'erreur: P>
dans le premier argument de '($)', nommément 'n: colatz' ' p> BlockQuote>
C'est l'indice de remarquer qu'il s'agit d'un problème de précaution. GHC vous dit que
N: Collatz ' code> a été analysé comme premier argument de
$ code>, pendant que vous vous attendiez à ce que le premier argument soit juste
colatz' code >. P>
À ce stade, j'intraps habituellement à GHCI et vérifiez les précédents impliqués à l'aide de la commande
: info code>: p>
xxx pré> Il dit que la prédécrance de
: code> est 5, tandis que la priorité de
$ code> est 0, ce qui explique pourquoi le
: code> est liant "plus serré" que le
$ code>. p> p>
Du sujet de sujet: Il pourrait s'agir de la fonction de nettoyant pour que la fonction Collatz calculille simplement l'étape suivante (donc
colatz :: intégral => a -> a code>), puis construisez les listes dans une étape séparée en utilisant quelque chose comme
primon-pied (/ = 1). itérer code>
Bien que parfois
$ code> puisse éliminer les parens, il ne peut pas toujours le faire, et d'autres fois, il est simplement plus propre à utiliser des parens.