It's written, że krotki Haskella są po prostu inną składnią dla algebraicznych typów danych. Podobnie są przykłady jak przedefiniować konstruktory wartości za pomocą krotek.Jaka jest różnica między konstruktorami wartości a krotkami?
Na przykład typ danych Drzewo w Haskell może być zapisany jako
data Tree a = EmptyTree | Node a (Tree a) (Tree a)
które mogą być przekształcone w „forma krotki” tak:
data Tree a = EmptyTree | Node (a, Tree a, Tree a)
Jaka jest różnica między Node
konstruktor wartości w pierwszym przykładzie, a rzeczywisty tuple
w drugim przykładzie? tj. Node a (Tree a) (Tree a)
vs. (a, Tree a, Tree a)
(oprócz samej składni)?
Pod maską znajduje się Node a (Tree a) (Tree a)
tylko inna składnia dla 3-krotnej liczby odpowiednich typów w każdej pozycji?
wiem, że można częściowo zastosować konstruktor wartości, takich jak Node 5
które będą miały typ: (Node 5) :: Num a => Tree a -> Tree a -> Tree a
możliwość sortowania można częściowo stosować zbyt krotki, używając (,,)
jako funkcję ... ale to nie robi” t wiedzieć o potencjalnych typów dla wpisów un-bound, takich jak:
Prelude> :t (,,) 5
(,,) 5 :: Num a => b -> c -> (a, b, c)
chyba, myślę, jawnie zadeklarować typ z ::
.
Oprócz specjałów składniowych takich jak ten, a także tego ostatniego przykładu określania typu, istnieje różnica w materiale między tym, czym jest "konstruktor wartości" w Haskell, a krotką używaną do przechowywania wartości pozycyjnych tego samego typu są argumenty konstruktora wartości?
Na podstawie punktu 2 wydaje się, że wprowadzenie typu danych (w przeciwieństwie do funkcji, które działają poza konwencją krotki) dotyczy głównie semantyki wprowadzanej dla konsumentów modułu: sposobu organizowania myślenia i czytania kodu. Jeśli wydajność osiągnięta w tym przypadku nie jest duża (co, jak zakładam, jest prawie zawsze, biorąc pod uwagę wszechobecność tworzenia typów danych w Haskell), to dodatkowy zysk semantyczny wygrywa. Ale jeśli coś jest bardzo krytyczne dla wydajności lub jeśli jest to prywatna część modułu, którego niewielu klientów powinno potrzebować, dobrze jest pomylić po stronie konwencji tuple? – ely
Kiedy mówię "konwencja krotkowa", mam na myśli funkcje przeznaczone do pracy na krotce, która nie jest inaczej nazwana lub używana w typie danych. Mówię to w ten sposób, ponieważ (i mógłbym być zdezorientowany) wygląda na to, że nie można mieć rekurencyjnego typu danych zrobionego wyłącznie z "krotki" bez użycia słów kluczowych "data" lub "newtype", które następnie trafiałyby te rozważania dotyczące pamięci, prawda? – ely
'newtype' jest pojęciem kompilacji i zostaje usunięte podczas kompilacji. W przeciwieństwie do 'danych' nie wprowadza narzutów pamięci nad typem, który zawija. Aktualizacje mojej odpowiedzi powinny wyjaśnić resztę. –