Mam typ Id a
i staram się zapobiec przypadkowemu Zmuszanie, np Id Double
do Id Int
.
Jeśli dobrze rozumiem role typu, poniższe nie powinny się kompilować.
{-# LANGUAGE RoleAnnotations #-}
import Data.Coerce (coerce)
type role Id nominal
newtype Id a = Id String
badKey :: Id Int
badKey = coerce (Id "I point to a Double" :: Id Double)
Niestety:
Prelude> :load Id.hs
[1 of 1] Compiling Main ( Id.hs, interpreted )
Ok, one module loaded.
*Main> :type badKey
badKey :: Id Int
Czego mi brakuje w typach ról?
type role
to, aby tak nie było. To pytanie nasuwa pytanie, dlaczego to nie zadziałało.
a
inId
jest zmienną fantomową i nie ma wpływu na rzeczywistą wartość wewnątrz. Gdyby tak byłonewtype Id a = Id a
, przymus by się nie udał.