2016-02-07 1 views
3

I ont défini trois fonctions qui haskell multiplier deux nombressignature de type de fonctions dans Haskell

k = \x y -> x * y 

foo y = \x -> x * y 

bar x = \x -> x * x 

Mais je reçois des signatures différentes pour toutes les trois fonctions.

λ> :t k 
k :: Integer -> Integer -> Integer 
λ> :t foo 
foo :: Num a => a -> a -> a 
λ> :t bar 
bar :: Num a => t -> a -> a 

Quelqu'un peut-il expliquer pourquoi c'est ainsi? Je peux voir t dans la signature de type de barre. est-il différent de l'utilisation normale de a, b, ou a1, a2 etc.

Répondre

6

Tout d'abord, toutes les signatures proviennent essentiellement de (*) :: Num a => a -> a -> a et de votre utilisation. Et oui k et foo devrait être le même, mais bar est en effet un peu différent que vous l'avez écrit ici.

  • foo devrait être évident (je l'espère) (il est juste que * est polymorphique et le type dit juste que)
  • pour bar c'est parce que le x sur le côté gauche n'est pas utilisé sur le côté right de sorte que vous obtenir le paramètre supplémentaire t - c'est le même que bar y = \x -> x * x
  • pour k voir le Monomorphism restriction - fondamentalement Haskell va tirer un type par défaut ici pour contourner quelques légers problèmes qui pourraient survenir. Il est un peu étrange que vous obtenez ici car par défaut nouvelle version GHCi ne devrait pas montrer ce comportement (voir le lien)

BTW: ne vous étonnez pas de beaucoup sur les noms des types;)

La leçon apprise devrait probablement être simplement d'écrire vos signatures (au moins sur les fonctions de haut niveau) ^^ - il aurait résolu tous vos problèmes