Bir türü var Id a
ve ben mesela yanlışlıkla coercing, bir engel olmaya çalışıyorum Id Double
bir etmek Id Int
.
Yazım rollerini doğru anlarsam, aşağıdakiler derlenmemelidir.
{-# 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)
Ne yazık ki, yapar:
Prelude> :load Id.hs
[1 of 1] Compiling Main ( Id.hs, interpreted )
Ok, one module loaded.
*Main> :type badKey
badKey :: Id Int
Yazım rollerinde eksik olan ne?
@ lehins Bunun
—
Joseph Sible-Reinstate Monica
type role
amacı, durumun böyle olmamasını sağlamaktı. Bu soru bunun neden işe yaramadığını soruyor.
a
inId
, hayali bir değişkendir ve içindeki gerçek değer üzerinde hiçbir etkisi yoktur. Eğer olsaydınewtype Id a = Id a
, zorlama başarısız olurdu.