Ich habe eine Art Id a
und ich versuche , aus Versehen Nötigung zu verhindern, beispielsweise ein Id Double
zu 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 role
ging darum, dass dies nicht der Fall ist. Diese Frage fragt, warum das nicht funktioniert hat.
a
inId
ist eine Phantomvariable und hat keinen Einfluss auf den tatsächlichen Wert im Inneren. Wenn Sie esnewtype Id a = Id a
getan hätten, wäre der Zwang gescheitert.