J'ai un type Id aet 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é.
ainIdest 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é.