У меня есть тип, Id a
и я пытаюсь предотвратить случайное принуждение, например, Id Double
к Id Int
.
Если я правильно понимаю роли типов, следующее не должно компилироваться.
{-# 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)
К сожалению, это делает:
Prelude> :load Id.hs
[1 of 1] Compiling Main ( Id.hs, interpreted )
Ok, one module loaded.
*Main> :type badKey
badKey :: Id Int
Что мне не хватает в типовых ролях?
@lehins Смысл в том,
—
Джозеф Сибл-Восстановить Монику
type role
чтобы это было не так. Этот вопрос спрашивает, почему это не сработало.
a
inId
является фантомной переменной и не влияет на действительное значение внутри. Если бы вы имелиnewtype Id a = Id a
, то принуждение было бы неудачным.