У меня есть тип, 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чтобы это было не так. Этот вопрос спрашивает, почему это не сработало.
ainIdявляется фантомной переменной и не влияет на действительное значение внутри. Если бы вы имелиnewtype Id a = Id a, то принуждение было бы неудачным.