Да предположим, че имам ADT, като
data Foo = Foo !Int
| Bar (Int->Int) Foo
Сега кажете, че искам да наложа някакъв вид допълнителна безопасност на типа, като се отърва от „типа магическо число“:
{-# LANGUAGE GADTs #-}
newtype Intey a = Intey { getIntey :: Int }
data Foo' a where
Foo :: !(Intey a) -> Foo' a
Bar :: (Intey a -> Intey b) -> Foo' a -> Foo' b
Тъй като b
е просто фантомен аргумент в конструктора, няма ограничения или нещо друго, той е по същество безсмислен - с изключение на проверката на типа. Следователно може ли да се компилира до същото като Foo
, без никакви разходи за производителност и т.н.?
~
)s? - person Daniel Gratzer   schedule 15.04.2014