web-dev-qa-db-fra.com

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 (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
77
mattbh

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.

92
sepp2k

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

13
sclv