Jak zapewnić jawne deklaracje typów dla funkcji podczas korzystania z GHCi?

Jak zdefiniować odpowiednik tej funkcji (zaczerpnięty z } ) wewnątrz GHCi?

import Data.List  

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

Bez deklaracji typu, GHCi akceptuje definicję funkcji, ale kończy się ona nieprzydatnym typem:

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

Wynikowa funkcja przyjmuje tylko listę jednostek jako parametr.

Czy Jest jakiś sposób na dostarczenie deklaracji typu w GHCi? A może jest inny sposób na zdefiniowanie takich funkcji, które nie wymagają deklaracji typu?

I saw no oczywiste wskazówki w podręczniku GHCi i eksperymentował z wyrażeniami takimi jak następujące (bezskutecznie):

> let numUniques' = ((length . nub) :: (Eq a) => [a] -> Int)
> :t numUniques'
numUniques' :: [()] -> Int
Author: mattbh, 2010-06-22

2 answers

Czy Jest jakiś sposób na dostarczenie deklaracji typu w GHCi?

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

A może istnieje inny sposób definiowania takich funkcji, które nie wymagają deklaracji typu?

Jeśli wyłączysz ograniczenie monomorfizmu za pomocą -XNoMonomorphismRestriction, wywnioskuje właściwy typ.

 86
Author: sepp2k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-22 12:43:00

Zauważ, że możesz również uniknąć ograniczenia monomorfizmu po prostu dodając "punkty" (tj. zmienne jawne) z powrotem do swojego wyrażenia. Więc to również daje prawidłowy typ:

Let numUniques x = length . nub $ x

 13
Author: sclv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-22 14:43:40