Ich habe eine Art Id aund ich versuche , aus Versehen Nötigung zu verhindern, beispielsweise ein Id Doublezu ein Id Int.
Wenn ich Typrollen richtig verstehe, sollte Folgendes nicht kompiliert werden.
{-# 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)
Leider tut es:
Prelude> :load Id.hs
[1 of 1] Compiling Main ( Id.hs, interpreted )
Ok, one module loaded.
*Main> :type badKey
badKey :: Id Int
Was fehlt mir an Typrollen?
type roleging darum, dass dies nicht der Fall ist. Diese Frage fragt, warum das nicht funktioniert hat.
ainIdist eine Phantomvariable und hat keinen Einfluss auf den tatsächlichen Wert im Inneren. Wenn Sie esnewtype Id a = Id agetan hätten, wäre der Zwang gescheitert.