我有一个类型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
我对类型角色缺少什么?