ponieważ newtype
, z grubsza rzecz biorąc, działa jak type
przy starcie i jak data
podczas kompilacji. Każda definicja data
dodaje dodatkową warstwę pośrednią - która w normalnych warunkach oznacza inne wyraźne miejsce, w którym coś może zostać pozostawione jako thunk - wokół wartości, które posiada, podczas gdy newtype
nie. "Konstruktor" na newtype
jest w zasadzie tylko iluzją.
Wszystko, co łączy wiele wartości w jedną lub daje wybór między wieloma przypadkami, koniecznie wprowadza warstwę pośrednią, aby to wyrazić, więc logiczna interpretacja newtype A = A Int Int
byłaby dwiema odłączonymi wartościami Int
bez niczego "trzymającego je razem" . Różnica w przypadku newtype A = A (Int, Int)
polega na tym, że krotka sama dodaje dodatkową warstwę pośrednią.
Porównaj to z data A = A Int Int
vs. data A = A (Int, Int)
.Pierwsza z nich dodaje jedną warstwę (konstruktor A
) wokół dwóch Int
s, podczas gdy druga dodaje tę samą warstwę wokół krotki, która sama dodaje warstwę wokół Int
s.
Każda warstwa indeksu generalnie dodaje też miejsce, w którym coś może być ⊥, więc rozważ możliwe przypadki dla każdej formy, gdzie? oznacza nie-dolnej wartości:
Dla newtype A = A (Int, Int)
: ⊥
, (⊥, ?)
, (?, ⊥)
, (?, ?)
Dla data A = A Int Int
: ⊥
, A ⊥ ?
, A ? ⊥
, A ? ?
Dla data A = A (Int, Int)
: ⊥
, A ⊥
, A (⊥, ?)
, A (?, ⊥)
, A (?, ?)
Jak widać z powyższego, pierwsze dwa są równoważne.
Na Ostatnia uwaga, tu jest zabawa demonstracja, jak newtype
różni się od data
. Rozważmy następujące definicje:
data D = D D deriving Show
newtype N = N N deriving Show
Jakie są możliwe wartości, w tym wszystkie możliwe ⊥, które z nich mają? Jak myślisz, jakie będą dwie poniższe wartości?
d = let (D x) = undefined in show x
n = let (N x) = undefined in show x
Załaduj je do GHC i dowiedz się!
Czy przeczytałeś [to] (http://www.haskell.org/haskellwiki/Newtype)? –
@ n.m., Dziękuję za link, ale czy mógłbyś omówić praktyczne kwestie? Czy ma to związek z dopasowaniem '(A _ _)'? Nie rozumiem, dlaczego równoważność tupetu prowadziłaby do nieintuicyjnego zachowania. – gatoatigrado