2010-10-24 27 views
0

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.)

Répondre

1

(f L (e::a)) ne fonctionnerait que si f étaient une fonction au curry, de type 'a list -> 'a list -> 'a list. Vous devriez faire:.

if pred e then (f (L, (e::a))) else (f (L,a)) 

BTW, smlnj se plaint d'un match redondant (sont donnés deux clauses f ([], a)).

+0

D'accord, je comprends. Qu'en est-il: – aitee

+0

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

+0

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.) –

1

Vous confondez uplées contre les appels de fonction cari. Votre définition de f exige un tuple, (a, b), mais vous lui passez les arguments comme f a b. Essayez de remplacer vos appels récursifs par f L ... avec f (L,...) à la place.

L'erreur de type est un peu inutile, mais il s'agit essentiellement de dire que vous passez une liste quand il attend un 2-tuple de listes.