J'ai un type Id a
et j'essaie d'empêcher toute contrainte accidentelle, par exemple, un Id Double
à un Id Int
.
Si je comprends bien les rôles de type, les éléments suivants ne doivent pas être compilés.
{-# 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)
Malheureusement, cela:
Prelude> :load Id.hs
[1 of 1] Compiling Main ( Id.hs, interpreted )
Ok, one module loaded.
*Main> :type badKey
badKey :: Id Int
Qu'est-ce que je manque sur les rôles de type?
type role
était de faire en sorte que ce ne soit pas le cas. Cette question demande pourquoi cela n'a pas fonctionné.
a
inId
est une variable fantôme et n'a aucun impact sur la valeur réelle à l'intérieur. Si vous l'aviez faitnewtype Id a = Id a
, la contrainte aurait échoué.