2010-11-28 28 views
1

Bonjour à tous Je cet extrait du code:erreur dans le SML de NJ

local 
fun NTimesF(f, n:int) = 
    if n = 1 then fn (x) => f(x) 
    else fn (x) => f(NTimesF(f, n - 1)(x)) 
in 
fun compList f n = if n = 0 then [] 
        else (NTimesF(f, n)) :: (compList f n-1) 
end; 

J'ai besoin d'écrire le programme qui reçoit une fonction f et entier n et produire la liste des fonctions telles que [f1, f2, ... fn] <- fn is the composition of the function n times mais chaque fois Je reçois une erreur:

- stdIn:7.11-7.46 Error: operator and operand don't agree [literal] 
    operator domain: ('Z -> 'Z) * ('Z -> 'Z) list 
    operand:   ('Z -> 'Z) * int 
    in expression: 
    NTimesF (f,n) :: (compList f) n - 1 
stdIn:6.6-7.46 Error: right-hand-side of clause doesn't agree with function result type [literal] 
    expression: int -> _ list 
    result type: int -> int 
    in declaration: 
    compList = (fn arg => (fn <pat> => <exp>)) 
- 

quelqu'un peut me aider s'il vous plaît, merci à l'avance

Répondre

1

Parce que l'application de la fonction a la priorité supérieure à laL'opérateur, compList f n-1 est analysé comme (compList f n) - 1, ce qui n'est évidemment pas ce que vous voulez.

Vous devez écrire compList f (n-1).

+0

Merci beaucoup, comment l'avez-vous remarqué? Vous connaissez ML? – rookie

+0

@rookie: Oui, je suis familier avec ML (sinon je ne naviguerais pas sur la balise sml ;-)). Le message d'erreur vous indique également où se trouve l'erreur et si vous regardez de près, il vous indique également comment l'expression a été analysée. Donc à partir de là, il est facile de trouver l'erreur avec un peu d'expérience. – sepp2k