Rolleri ve kafa karıştırıcı davranışı `zorlama 'ile yazın


11

Bir türü var Id ave ben mesela yanlışlıkla coercing, bir engel olmaya çalışıyorum Id Doublebir 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?


ain Id, 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.
lehins

@ lehins Bunun type roleamacı, durumun böyle olmamasını sağlamaktı. Bu soru bunun neden işe yaramadığını soruyor.
Joseph Sible-Reinstate Monica

Yanıtlar:


12

Coercibleüç olası "tür" örneğine sahiptir (bunlar derleyici tarafından otomatik olarak oluşturulur, kullanıcı tarafından tanımlanmaz). Bunlardan sadece biri rollerden etkilenir .

  • Her tür kendi başına zorlanabilir.
  • Etkilenen tür değişkenleri representationalveya ise, bir tür yapıcısını "altında" zorlayabilirsiniz phantom. Örneğin, bir zorlamak olabilir Map Char Intbir içine Map Char (Data.Monoid.Sum Int)için çünkü Mapelimizdeki type role Map nominal representational.
  • Bu olabilir zaman newtype yapıcı kapsamı içinde sağlanan, altta yatan tip ve tam tersi için bir newtype zorlamak. Bu, tüm rolleri yok sayar! Gerekçe, kurucunun mevcut olduğu göz önüne alındığında, her zaman manuel olarak sarıp sarmalayabileceğinizdir, bu nedenle rol size herhangi bir güvenlik sağlamaz.

Örneğinizde üçüncü kural geçerlidir. Yeni tür başka bir modülde tanımlanmış ve yapıcı içe aktarılmamış olsaydı, zorlama başarısız olurdu (tekrar çalışmasını sağlamak için rolü değiştirmeniz gerekir phantom).

Bu GHC sayısında , yeni tipler için biraz şaşırtıcı özel davranış açıklanmaktadır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.