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