Tôi có một loại Id a
và tôi đang cố gắng ngăn chặn vô tình ép buộc, ví dụ: an Id Double
to an Id Int
.
Nếu tôi hiểu chính xác các loại vai trò, sau đây không nên biên dịch.
{-# 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)
Thật không may, nó không:
Prelude> :load Id.hs
[1 of 1] Compiling Main ( Id.hs, interpreted )
Ok, one module loaded.
*Main> :type badKey
badKey :: Id Int
Tôi còn thiếu gì về vai trò loại?
@lehins Quan điểm của việc
—
Joseph Sible-Phục hồi Monica
type role
làm cho điều đó không phải là trường hợp. Câu hỏi này là hỏi tại sao điều đó không làm việc.
a
trongId
là một biến ảo và không có tác động đến giá trị thực bên trong. Nếu bạn cónewtype Id a = Id a
, thì sự ép buộc sẽ thất bại.