2017-09-02 7 views
1

Je suis nouveau à SML et ne comprends pas très bien mon problème, même si je suis certain que je suis en faute. Tout d'abord, voici deux fonctions courtes que je suis en train de tester et leurs descriptions.SML Erreur: l'opérateur et l'opérande ne sont pas d'accord [mésappariement tycon]

MakeInterval - prend un nombre naturel r, (également utilisé pour rp) et un nombre naturel t, et renvoie l'intervalle [t-r, t + r].

fun MakeInterval(r,rp,t) = 
    if r + rp < 0 then [] 
    else t-r :: MakeInterval(r-1,rp,t); 

E.g. MakeInterval (3,3,10) retournera [7,8,9,10,11,12,13]. Si vous avez une suggestion pour se débarrasser de rp, s'il vous plaît faites le moi savoir. C'est la seule façon dont je pourrais penser à garder la trace de la valeur originale de r tout en maintenant l'ordre trié.

NotDivisible - Prend un nombre naturel r, une liste des nombres naturels TS1 et une autre liste de nombres naturels TS2. Code utilisant ts2 n'est pas encore écrit.

r spécifie les limites inférieure et supérieure de l'intervalle, (le même que MakeInterval), et ts1 est une liste de numéros à introduire dans la carte avec la fonction MakeInterval.

fun NotDivisible(r, ts1, ts2) = 
    map (fn x => MakeInterval(r,r,x), ts1); 

Cette fonction doit retourner une liste d'intervalles. Par exemple. NotDivisible (3, [10,20,30], [2,4,6]) retournera (pour l'instant) [[7..13], [17..23], [27..33]]. Après avoir obtenu ce fonctionnement, je vais commencer à manipuler ces listes pour trouver quels sont les nombres parmi ces nombres qui sont indivisibles par l'un des nombres de ts2.

Mais pour l'instant, mon problème réside dans les définitions de fonctions telles que je les ai. MakeInterval est défini sans aucun problème et je l'ai testé lui-même. Ceci est l'erreur que je reçois en essayant de définir NotDivisible:

stdIn:5.33-5.71 Error: operator and operand don't agree [tycon mismatch] 
    operator domain: 'Z -> 'Y 
    operand:   (int -> int list) * 'X 
    in expression: 
    map ((fn x => MakeInterval <exp>),ts1) 

J'ai essayé spécifier tous les types manuellement sans succès. Tout a un sens logique pour moi, mais il y a clairement une question de syntaxe ici que je ne suis pas.

Répondre

1

Le problème avec ce qui précède est l'invocation de la carte, la fonction est cari

map : ('a -> 'b) -> 'a list -> 'b list; 

donc, un petit changement aux parenthèses:

fun NotDivisible(r, ts1, ts2) = map (fn x => MakeInterval(r,r,x)) ts1; 

vous donne:

val NotDivisible = fn : int * int list * 'a -> int list list 
+0

Fantastique! Je vous remercie. C'est drôle comment une si petite erreur peut me retarder des heures. –