W Haskell, uważam, że możliwe jest alias typu w taki sposób, że kompilator nie zezwala na odniesienia między typem aliasingu a typem niesiasnym. Według this stack overflow question, można użyć Haskell za newtype
tak:Czy w ramach Scala możliwe jest alias typu, ale zabronione jest wykorzystywanie krzyżowe aliasów/nie-aliasów, takich jak Haskell?
newtype Feet = Feet Double
newtype Cm = Cm Double
gdzie Feet
i Cm
będą zachowywać się jak wartości podwójnymi, ale próbuje pomnożyć wartość Feet
a wartość Cm
spowoduje błąd kompilatora.
EDYCJA: Ben wskazał w komentarzach, że powyższa definicja w Haskell jest niewystarczająca. Feet
i Cm
będą nowymi typami, dla których nie będzie zdefiniowanych żadnych funkcji. Robi trochę więcej badań, okazało się, że będzie działać następuje:
newtype Feet = Feet Double deriving (Num)
newtype Cm = Cm Double deriving (Num)
To tworzy nowy typ, który wynika z istniejącego Num
typu (wymaga użycia przełącznika: -XGeneralizedNewtypeDeriving
). Oczywiście te nowe typy będą jeszcze bardziej wartościowe, wynikające z innych typów, takich jak Show
, Eq
itp., Ale jest to minimum wymagane do prawidłowej oceny Cm 7 * Cm 9
.
Zarówno Haskell i Scala mieć type
, który po prostu aliasy istniejącego typu i pozwala kod bezsensowny takie jak ten przykład w Scala:
type Feet = Double
type Cm = Double
val widthInFeet: Feet = 1.0
val widthInCm: Cm = 30.48
val nonsense = widthInFeet * widthInCm
def getWidthInFeet: Feet = widthInCm
robi Scala mieć newtype
odpowiednik, przy założeniu, że robi to, co myślę, robi?
To nie jest tak, jak 'newtype' działa w Haskell. Tworzy ** nowy typ **, który domyślnie nie ma zdefiniowanych żadnych funkcji. Zatem wartości 'Feet' i' Cm' w twoich przykładach nie będą mogły być pomnożone, dopóki nie zaimplementujesz dla nich mnożenia. Typy zadeklarowane z 'newtype' będą * reprezentowane * identycznie do typu zawijanego, co oznacza, że istnieje zerowy koszt wykonania implementacji operacji na' newtype' przez proste rozpakowanie i przejście do operacji na typie zawiniętym. Ale to jest naprawdę optymalizacja, nieistotna dla tego, co oznacza "typ". – Ben
Dzięki za informację, zaktualizowałem pytanie, aby to odzwierciedlić. Nadal jest znawcą Haskella, choć bardzo chce go poprawić. =) – rybosome
Należy zauważyć, że dodając Cm do Cm, aby uzyskać Cm ma sens, pomnożenie Cm przez Cm dostarczy Ci Cm², który mierzy obszar, a nie długość. Używanie systemu typu Haskell do śledzenia jednostek może być dość trudne do zrobienia. – shachaf