ฉันมีชนิด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
ข่มขู่จะล้มเหลว