我有一个类型,Id a
并且我正尝试防止意外强制,例如将an Id Double
更改为an 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的要点
—
约瑟夫·西布尔-恢复莫妮卡
type role
是使情况并非如此。这个问题在问为什么那没有用。
a
inId
是一个幻像变量,对内部的实际值没有影响。如果您有newtype Id a = Id a
,那么胁迫将失败。