2017-01-22 1 views
1

De temps en temps, je reçois une erreur qui ressemble à ceci:F # Signature Comprendre: « l'opérateur -> et compilateur erreurs »

opgave.fsx(28,14): error FS0001: This expression was expected to have type 
    'int' 
but here has type 
    'int -> int' 

opgave.fsx(33,35): error FS0001: This expression was expected to have type 
    'int list' 
but here has type 
    'int -> int list -> int list' 

Ce qui me confond est ce que cela signifie par l'opérateur ->? comme je le comprends alors de la première erreur alors on attend un int mais on lui donne une expression qui prend un int et retourne un autre int. Peut-être que je ne comprends pas? Si j'ai raison, quel est le problème exactement? Je pourrais jurer que j'ai déjà fait quelque chose de similaire.

le code de ces erreurs sont basées sur se présente comme suit:

member this.getPixelColors(x,y,p) : int list = 
    let pixel = image.GetPixel(x,y) 
    let stringPixel = pixel.ToString() 
    let rec breakFinder (s:string) (h:int) = 
     match s.[h] with 
     |',' -> s.[9..(h-1)] |> int 
     |_ -> (breakFinder(s (h+1))) // this is line 28 
    let rec yello x y p = 
     match x with 
     |l when l = imageW -> match y with 
          |k when k = imageH -> [email protected][(breakFinder stringPixel 0)] 
          |_ -> yello((0)(y+1)([email protected][(breakFinder stringPixel 0)])) // this is line 33 
     |_ -> yello((x+1)(y)([email protected][(breakFinder stringPixel 0)])) // there is an error in this line aswell identical to line 33 
    yello 0 0 [] 

Quelqu'un peut-il me faire comprendre donc je serai en mesure de traiter ce moi-même à l'avenir?

+2

Si vous ajoutez les numéros de ligne, ou peut-être mettre des commentaires à côté de la lignes qui correspondent aux erreurs, cela nous aiderait à identifier les problèmes ici. – Stuart

+2

J'ai ajouté des commentaires dans le code. Il est dans tous les appels récursifs – Nulle

+1

Merci, cela correspond à mon hypothèse. S'il vous plaît essayer ma réponse et laissez-moi savoir si cela aide. – Stuart

Répondre

4

Lors de la lecture d'une signature de la fonction F #, la flèche (->) est un séparateur, et vous pouvez lire la signature suivante:

int -> int -> string 

par exemple en fonction qui prend 2 int s et retourne un string. L'une des raisons pour lesquelles cela est présenté est que vous pouvez également considérer cette fonction comme une fonction qui prend 1 int et vous renvoie une fonction qui prend 1 int et renvoie une string, c'est ce qu'on appelle une application partielle.

Dans votre cas, j'utiliserais les numéros de ligne dans l'erreur pour vous aider à identifier le problème. Donc sur la ligne 28, vous pouvez lui donner une fonction qui prend un int et renvoie un int, mais il veut une valeur int, peut-être que vous avez oublié d'invoquer la fonction avec une entrée? Sur la ligne 33, il veut int list qui est une autre façon d'exprimer list<int>. Vous lui avez cependant donné une fonction qui prend un int, un list<int> et renvoie list<int>. Encore une fois, vous devez peut-être appeler cette fonction avec les deux entrées afin de satisfaire votre contrainte de type.

Edit: En regardant à nouveau cela, je pense que je peux deviner quelles lignes sont les erreurs. Il semble que lorsque vous invoquez certaines de ces fonctions, vous mettez plusieurs paramètres entre parenthèses. Essayez de mettre à jour votre code à ceci:

member this.getPixelColors(x,y,p) : int list = 
    let pixel = image.GetPixel(x,y) 
    let stringPixel = pixel.ToString() 
    let rec breakFinder (s:string) (h:int) = 
     match s.[h] with 
     |',' -> s.[9..(h-1)] |> int 
     |_ -> (breakFinder s (h+1)) 
    let rec yello x y p = 
     match x with 
     |l when l = imageW -> match y with 
          |k when k = imageH -> [email protected][(breakFinder stringPixel 0)] 
          |_ -> yello 0 (y+1) ([email protected][(breakFinder stringPixel 0)]) 
     |_ -> yello (x+1)(y)([email protected][(breakFinder stringPixel 0)]) 
    yello 0 0 [] 

Par exemple, pour invoquer breakFinder qui a la signature string -> int -> int, vous feriez ceci: let number = breakFinder "param1" 42

+1

Cela l'a corrigé merci! Je vois le problème maintenant! Tu es le meilleur! – Nulle