У мене є тип, 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 Справа в тому,
—
Джозеф Сибл-
type role
щоб зробити це не так. Це питання задає питання, чому це не спрацювало.
a
inId
є фантомною змінною і не впливає на фактичне значення всередині. Якби у вас бувnewtype Id a = Id a
, то примус був би невдалим.