2017-10-13 27 views
0

La signature pour cette fonction me confond et toute l'information en ligne me confond. Quelqu'un peut-il m'expliquer la signature de la fonction et peut-être me donner un exemple?Quelqu'un peut-il expliquer en détail la signature pour cette fonction de haskell?

sort3 :: Ord a => (a -> a -> Ordering) -> [a] -> [a] 
sort3 cmp xs | length(xs) < 1 = xs 

C'est l'erreur que j'obtiens.

Couldn't match expected type ‘a -> a -> Ordering’ 

with actual type ‘[t0]’ 

• In the first argument of ‘sort3’, namely ‘[]’ 
    In the expression: sort3 [] 
    In an equation for ‘it’: it = sort3 [] 
• Relevant bindings include 
    it :: [a] -> [a] (bound at <interactive>:2:1) 

Répondre

2

Il y a deux arguments à cette fonction:

sort3 :: Ord a => (a -> a -> Ordering) -> [a] -> [a] 

Le premier argument est lui-même un function qui prend deux arguments: une chose commandable et une chose commandable (ce sont tout ce qui est dans la classe de types Ord) et il retourne quelque chose de type Ordering.

Le deuxième argument est un list de ces choses, qui sont exactement la même chose à commander que le premier argument (lui-même une fonction) prendrait deux de.

Enfin, la fonction sort3 renvoie une liste de cette même chose à classer.

Maintenant, GHCi vous dit qu'il attend le premier argument d'être ce que votre signature dit qu'il devrait être (une fonction qui lui-même prend deux arguments et retourne un Ordering), mais vous a transmis une liste vide à la place:

Couldn't match expected type ‘a -> a -> Ordering’ 

with actual type ‘[t0]’ 

• In the first argument of ‘sort3’, namely ‘[]’ 
    In the expression: sort3 [] 

En d'autres termes: « vous me dit que votre premier argument serait (a -> a -> Ordering), mais vous avez invoqué la fonction comme ceci sort3 [] et je ne peux pas interpréter [] en fonction de cette signature. (a -> a -> Ordering)

+0

Oh D'accord, je vois ce que vous dites, merci pour la simplicité et rapide au point de réponse – christian