Mam typ Id ai staram się zapobiec przypadkowemu Zmuszanie, np Id Doubledo 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 roleto, aby tak nie było. To pytanie nasuwa pytanie, dlaczego to nie zadziałało.
ainIdjest 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ł.