Tôi có một loại Id avà tôi đang cố gắng ngăn chặn vô tình ép buộc, ví dụ: an Id Doubleto 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 rolelà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.
atrongIdlà 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.