Cela fait partie d'un devoir de sorte que mon objectif est de comprendre pourquoi c'est faux. Comme je l'ai déjà mentionné, j'utilise Moscow ML.Standard ML (using MoscowML) Qu'est-ce qui ne va pas avec cette fonction? (filtre)
fun filter pred = let
fun f ([], a) = []
| f ([], a) = a
| f (e::L, a) = if pred e then (f L (e::a)) else (f L a)
in
f
end
L'erreur que je reçois est:
| f (e::L, a) = if pred e then (f L (e::a)) else (f L a)
^
Type clash: expression of type
'a list cannot have type
'a list * 'b list
Je suis en train de lire sur la documentation, et il n'a pas vraiment aidé. Ce que je ne comprends vraiment pas, c'est d'où vient la liste. Dans notre mission, nous devons utiliser un accumulateur avec récursion de queue. Je crois que mon erreur est de savoir comment le filtre appelle la fonction f. Le filtre prend le prédicat comme argument et f devrait prendre la liste et l'accumulateur qui est initialement la liste vide.
J'ai essayé d'appeler f comme: f L [], mais dans d'autres exemples, nous n'avions pas besoin d'appeler f avec son argument et il était en quelque sorte passé automatiquement.
Quoi qu'il en soit, toute aide aider à comprendre où mon erreur est et des conseils sur la façon de résoudre le problème serait grandement appréciée.
-aitee
(aussi si quelqu'un pouvait me donner des conseils sur le décodage des erreurs d'expression de type qui pourrait être très bénéfique.)
D'accord, je comprends. Qu'en est-il: – aitee
en f fin Je ne passe rien à f? Comment cela fonctionne-t-il réellement? (le flux de la fonction à l'intérieur d'une fonction.) – aitee
S'il s'agit d'une réponse utile, cliquez sur le bouton Accepter (la coche) et publiez toutes les questions sans rapport. (Un indice cependant: vous retournez une fonction.) –