Comment fournir des déclarations de type explicites pour les fonctions lors de l’utilisation de GHCi?

Comment définir l’équivalent de cette fonction (prise de learnyouahaskell ) dans GHCi?

import Data.List numUniques :: (Eq a) => [a] -> Int numUniques = length . nub 

Sans la déclaration de type, GHCi accepte la définition de la fonction, mais elle se termine par un type inutile:

 Prelude Data.List> import Data.List Prelude Data.List> let numUniques' = length . nub Prelude Data.List> :t numUniques' numUniques' :: [()] -> Int 

La fonction résultante accepte uniquement une liste d’unités en tant que paramètre.

Existe-t-il un moyen de fournir des déclarations de type dans GHCi? Ou existe-t-il une autre façon de définir des fonctions comme celles-ci qui ne nécessitent pas de déclaration de type?

Je n’ai pas vu d’indices évidents dans le guide GHCi et j’ai expérimenté des expressions comme celles-ci (en vain):

 > let numUniques' = ((length . nub) :: (Eq a) => [a] -> Int) > :t numUniques' numUniques' :: [()] -> Int 

Existe-t-il un moyen de fournir des déclarations de type dans GHCi?

 let numUniques' :: (Eq a) => [a] -> Int; numUniques' = length . nub 

Ou existe-t-il une autre façon de définir des fonctions comme celles-ci qui ne nécessitent pas de déclaration de type?

Si vous désactivez la ressortingction de monomorphisme avec -XNoMonomorphismRessortingction , cela -XNoMonomorphismRessortingction le bon type.

Notez que vous pouvez également éviter la ressortingction du monomorphisme en ajoutant simplement des “points” (c’est-à-dire des variables explicites) à votre expression. Donc, cela donne aussi le type correct:

laissez numUniques x = longueur. nub $ x