11
votes

Haskell: application de fonction avec $

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]


2 commentaires

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 ), puis construisez les listes dans une étape séparée en utilisant quelque chose comme primon-pied (/ = 1). itérer


Bien que parfois $ puisse éliminer les parens, il ne peut pas toujours le faire, et d'autres fois, il est simplement plus propre à utiliser des parens.


4 Réponses :


18
votes

$ a une priorité inférieure puis : (ainsi que quelque chose d'autre) afin que votre fonction analyse comme xxx

ceci conduit à votre erreur-type. Le deuxième argument de : attend une liste mais vous passez à la place de la fonction Collatz.

Si vous voulez toujours éviter la parenthèse autour de la partie 3N + 1, vous pouvez faire quelque chose comme Le suivant xxx

Bien que ceux-ci ne soient pas nécessairement plus propres, alors l'original. Si vous vous demandez, le (n:) dans le premier exemple est un sucre syntaxique pour \ x -> n: x


0 commentaires

6
votes

: lie plus fortement que $ . Considérer xxx

notez l'expression 1: f trouvé par l'analyseur; Il voit (1: f) $ 2 plutôt que 1: (F $ 2) .


0 commentaires

3
votes

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 xxx

mais cela ne vous achète évidemment pas beaucoup, car vous avez toujours des parenthèses.


0 commentaires

10
votes

É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:

dans le premier argument de '($)', nommément 'n: colatz' '

C'est l'indice de remarquer qu'il s'agit d'un problème de précaution. GHC vous dit que N: Collatz ' a été analysé comme premier argument de $ , pendant que vous vous attendiez à ce que le premier argument soit juste colatz' .

À ce stade, j'intraps habituellement à GHCI et vérifiez les précédents impliqués à l'aide de la commande : info : xxx

Il dit que la prédécrance de : est 5, tandis que la priorité de $ est 0, ce qui explique pourquoi le : est liant "plus serré" que le $ .


0 commentaires