Aynı türde veri yapıcılarına neden farklı türde yapıcılarda izin verilmiyor?


11

Aşağıdaki bildirim bir hata veriyor:

type Vec2d = (Float, Float)
type Vec3d = (Float, Float, Float)
-- Rect x y defines a rectangle spanning from (0,0) to (x,y)
data Obj2d = Rect Float Float
           | Translate Vec2d Obj2d
-- Cuboid x y z defines a cuboid spanning from (0,0,0) to (x,y,z)
data Obj3d = Cuboid Float Float Float
           | Translate Vec3d Obj3d

yani Multiple declarations of 'Translate'.

Şimdi, bu sınırlamanın neden ortaya çıktığını merak ediyorum?

Eğer sınırlama orada olmasaydı,

Translate (1, 1) Rect 2 2 ve Translate (1, 2, 3) Cuboid 1 1 1kulağa doğal geliyor.

Ben (hemen) bu nasıl aynı adı kullanarak izin vermemek için bir ayrıştırma sorun teklif ile sonuçlanabilir görmüyorum, türü argüman tarafından çıkarılabilir ( Rect 2 2bir Obj2d, bir Cuboid 1 1 1, bir Obj3d).

Eminim dil tasarımcıları farklı türdeki veri yapıcıları için aynı adı kullanarak izin vermemeyi tercih etmelerinin iyi bir nedeni var, ama öğrenmek istiyorum: neden, açıkça gerekli olmadığında?

(Ve tür ayrımı Haskell'in ekmek ve tereyağı işidir!)


3
Bağımsız değişken tarafından çıkarılan türle ilgili olarak: Bazen bağımsız değişken türünün işlevin türünden çıkarıldığını biliyor musunuz?

@delnan Bunun farkında değildim ... bana bir cevap gibi geliyor. Her zaman çıkarımın aşağıdan yukarıya doğru olduğunu anladım, ancak belirleyici bir faktör olarak tanımladığınız gibi tip grafiğinin diğer tarafından tür bilgilerini kullanarak belirsizlik çözünürlüğünü görebiliyordum ... bunun için zihinsel imajım, üstündeki grafik ve işlev çağrıları, çözünürlük altından yukarı katlanarak oluşturulan bir agrega, ama bu oldukça değil bütün diyorsunuz ki, bir resim mi? Şaşırtıcı olmayan bir şekilde, mükemmel çıkarım ile bağımlı olarak yazılan bir dilde bu muhtemelen daha doğrudur ..
Jimmy Hoffa

Yanıtlar:


13

Bunun nedeni, veri yapıcılarının sadece işlevler olması ve Haskell'de işlev aşırı yüklemesine izin verilmemesidir. Türlerinizi tanımlamak için GADT sözdizimini kullanırsanız daha açık olabilir:

{-# LANGUAGE GADTs #-}
data Obj2d where
    Rect :: Float -> Float -> Obj2d   -- a function from floats to obj2d's
    Translate :: Vec2d -> Obj2d       -- a function from vec2d's to Obj2d's

Onların (GHC geliştiricileri) type class, aynı veri yapıcıyı veya benzer bir şeyi paylaşan tüm türler için yeni bir tanıtma içeren bu soruna olası çözümler üzerinde çalıştıklarına inanıyorum . Bizi izlemeye devam edin, probleminize bir çözüm yakında geliyor olabilir! (Umuyorum)


Kesinlikle type classşart koştuğunuz bu yapıları dört gözle bekliyorum . - nedenidir: Ben yapabilirim, bir sorun yok Translate2ve Translate3d, ama yerine ad kirletmez ederim.
Sz

Ben bir GHC geliştiricisi değilim, bu yüzden sadece duy. Umarım da olur.
bstamour
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.