나는 유형을 가지고 있으며 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 요점은
—
Joseph Sible-Reinstate Monica
type role
그렇지 않은 것이 었습니다. 이 질문은 왜 작동하지 않는지 묻습니다.
a
inId
은 팬텀 변수이며 실제 값에 영향을 미치지 않습니다. 당신이 있었다면newtype Id a = Id a
, 강제는 실패했을 것입니다.