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
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.
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
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