2017-09-13 8 views
0

Bonjour, je reçois des erreurs de compilation dans le code SML suivant, quelqu'un peut-il m'aider?Erreur dans le code SML

Error: operator and operand don't agree [UBOUND match] 
    operator domain: 'Z list 
    operand:   ''list 
    in expression: 
    null mylist 
stdIn:4.15-4.24 Error: operator and operand don't agree [UBOUND match] 
    operator domain: 'Z list 
    operand:   ''list 
    in expression: 
    hd mylist 
stdIn:6.19-6.36 Error: operator and operand don't agree [UBOUND match] 
    operator domain: 'Z list 
    operand:   ''list 
    in expression: 
    tl mylist 
stdIn:6.10-7.21 Error: operator is not a function [circularity] 
    operator: 'Z 

dans l'expression: (exists_in (point, tl mylist)) exists_in

Code

:

fun exists_in (item: ''int, mylist:''list) = 
     if null mylist 
     then false 
     else if (hd mylist) = item 
     then true 
     else exists_in(item, tl mylist) 
    exists_in(1,[1,2,3]); 
+0

Je pense que vous vouliez dire 'int' et' int list' ou ''' a' et' '' une liste', pas '' 'int' et ''' list'. – molbdnilo

Répondre

4

Ce que chacun des messages d'erreur est vous est que vous appliquez une fonctionner à quelque chose du mauvais type. Par exemple, null est de type 'a list -> bool et s'attend donc à être appliqué à un argument de type 'a list. En exists_in, vous postulez null à quelque chose de type ''list en ligne 4.

SML fournit aussi l'inférence de type, donc il n'y a pas de réel besoin de spécifier les types de vos arguments (bien qu'il peut être utile pour le débogage). Si vous voulez spécifier les types, comme l'a commenté molbdnilo, les types que vous recherchez sont int et int list ou ''a et ''a list ('' a étant une variable de type pour les types d'égalité). Sans aucun doute, peut-être une façon plus idiomatique d'écrire votre fonction est de définir l'analyse cas par cas sur la structure de votre liste, plutôt que d'utiliser des contrôles booléens. L'avantage de ceci est que vous êtes immédiatement donné les données soutenant la vérification booléenne sur si la liste est vide ou non, plutôt que de vérifier puis d'extraire les données. Par exemple:

fun exists_in (item, []) = false 
    | exists_in (item, h::t) = (item = h) orelse exists_in (item, t)