Comment définir l'équivalent de cette fonction (tirée 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 retrouve avec 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 comme 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écessite pas de déclarations de type?
Je n'ai vu aucun indice évident dans le guide GHCi et j'ai expérimenté des expressions comme les suivantes (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écessite pas de déclarations de type?
Si vous désactivez la restriction du monomorphisme avec -XNoMonomorphismRestriction
, il déduira le bon type.
Notez que vous pouvez également éviter la restriction du monomorphisme simplement en ajoutant des "points" (c'est-à-dire des variables explicites) à votre expression. Donc, cela donne également le bon type:
soit numUniques x = longueur. nub $ x