Предположим, у меня есть 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