Jest to prawdopodobnie bardzo podstawowe pytanie, ale wydaje się, że nie zostało ono uwzględnione w SO.Haskell- (typ deklaracja) co to jest "a"?
Niedawno odbyła się Haskell i aż do teraz wpisać deklaracje składało się głównie z następujących powodów:
Int
Bool
Float
etc, etc
Teraz jestem coraz w listach i widzę deklaracji typu, które używają a
, takie jak na poniższym funkcji który dokonuje iteracji asocjacyjną listy:
contains :: Int -> [(Int,a)] -> [a]
contains x list = [values | (key,values)<-list, x==key]
Może ktoś dostarczyć wyjaśnienie, co to a
jest i jak to działa? Z obserwacji wydaje się reprezentować każdy typ. Czy to znaczy, że mogę wprowadzić dowolną listę dowolnego typu jako parametr?
Co równie ważne, "a" nie jest specjalne: * każdy * mały identyfikator oznacza to. Jest to zmienna * typu * i możliwe jest istnienie wielu różnych zmiennych typu w tym samym sygnaturze. Na przykład 'const :: a -> b -> a' przyjmuje dwa argumenty, każdy w ogóle typu i zwraca wartość tego samego typu, co pierwsze wejście. – amalloy
Widzę, jest bardzo ogólna. Sądzę więc, że w większości przypadków "a" generalnie reprezentuje elementy, których moja funkcja tak naprawdę nie używa lub zmienia, za dużo. – Bolboa
@Bolboa: Tak, jest to ściśle związane z pojęciem "generics" w innych językach. I tak, jeśli typ jest całkowicie ogólny, niewiele można zrobić bezpośrednio na samą wartość. Haskell ma sposób na dostarczenie większej ilości informacji o typie (na przykład "można porównać dla równości", "można wydrukować", "można traktować jak liczbę"), co pozwala na większe przetwarzanie wartości ; jeśli jesteś zainteresowany tym, to szukaj "klas" w dokumentacji lub samouczku. – psmears