jestem trochę mylić, co twoim celem jest, ale chodźmy przez ten krok po kroku, a może będę klikniemy prawym punkt:
:t
Informuje typ zmiennej ; nie ma sensu, gdy jest zastosowany do typu, ponieważ po prostu zwróci dokładnie to, co przekazałeś. Wskazówki Tutaj błędy wam powiedzieć, że :t
oczekuje jakieś wartości danych jako parametr:
Prelude> :t Maybe
<interactive>:1:1: Not in scope: data constructor `Maybe'
Prelude> :t (Maybe Integer)
<interactive>:1:2: Not in scope: data constructor `Maybe'
<interactive>:1:8: Not in scope: data constructor `Integer'
Ty może utworzyć typ częściowej:
Prelude> type T = Maybe
Prelude> Just 5 :: T Integer
Just 5
type T a = Maybe a -- alternately, with explicit type parameters
Prelude> Just 'a' :: T Char
Just 'a'
Ty nie utworzyć konstruktor danych dla częściowego typu, ponieważ nie reprezentują danych. Jakie wartości może mieć Maybe
lub Vector
bez sparametryzowania na typie? Możesz być skłonny myśleć, że Maybe
może mieć wartość Nothing
, ale Nothing
jest wpisany jako:
Prelude> :t Nothing
Nothing :: Maybe a
Klucz Jako, że Nothing
może być dowolnyMaybe a
, ale to musi jeszcze a
wiedzieć to Nothing
. (To trochę tak, gdybym powiedział ci "przynieś mi kieliszek" zamiast "przynieś mi szklankę czegoś" - nie możesz ważnie przestrzegać, dopóki przynajmniej nie skończę mojej myśli).
Można z pewnością create częściowo stosowana funkcje który zwróci kompletny typ raz są one stosowane:
Prelude> let f = Just :: a -> T a
Prelude> f 5
Just 5
Prelude> :t f 'a'
f 'a' :: T Char
Myślę [tę stronę] (https://webcache.googleusercontent.com/search?q=cache:3GDV7F446NMJ:www.haskell.org/pipermail/haskell-cafe/2013-May/108350.html+&cd= 1 & hl = en & ct = clnk & gl = us) mogą być przydatne. –
Typ 'T1' nie zawiera żadnych wartości, więc nie można utworzyć dla niego" konstruktora ". – augustss
FYI, "typ typu" nazywany jest * rodzajem *, który można uzyskać wykonując ': rodzaj T1' w ghci. – Wes