Konstruktor typu przyjmuje jeden lub więcej argumentów by stworzyć końcowy typ danych. W ten sposób Haskell realizuje typy parametryczne. Przykładowo [] (lista) jest takim konstruktorem typu — by stać się pełnoprawnym typem potrzebuje jednego argumentu określającego typ elementów listy. Z tego powodu [Int] (lista liczb całkowitych), [Float] (lista liczb zmiennoprzecinkowych), a nawet [ [ Int ] ] (lista list liczb całkowitych) są prawidłowymi aplikacjami konstruktora typu []. Stąd można wywnioskować, że [] jest typem rodzaju . Ponieważ Int ma rodzaj , aplikacja [] do niego daje [Int], rodzaju .
Rekonstrukcja rodzajów Standardowy Haskell nie dopuszcza rodzajów polimorficznych, mimo pełnego wsparcia typów polimorficznych. Stąd w poniższym przykładzie:data Tree z = Leaf | Fork (Tree z) (Tree z)teoretycznie rodzaj parametru z może być dowolny, jednakże Haskell domyślnie zakłada, że parametry konstruktorów danych są opisywane przez typ rodzaju , chyba że deklaracja wprost wskazuje inaczej (patrz poniżej). Z tego powodu kompilator odrzuci następujące użycie Tree :type FunnyTree = Tree [] -- błądKonkretnie rzecz ujmując, rodzaj [], czyli , nie pasuje do domyślnego rodzaju z, czyli .