SORU
9 EKİM 2012, Salı


'In DZD ne Haskell'In mevcut kısıtlama sistemi?

Haskell'ın "" kısıtlama sistemi, DZD 7.6 ve aşağıda. olarak kırık ile bazı sorunlar olduğunu duydum Nedir ""? yanlış Bu kusurları üstesinden gelmek için karşılaştırılabilir mevcut bir sistem var mı?

Örneğin, her iki edwardk ve tekmo belaya (*29 örneğin*) çalıştırın.

CEVAP
11 EKİM 2012, PERŞEMBE


Tamam, bu hakkı elde etmek istediğim için buraya göndermeden önce diğer insanlar ile çeşitli tartışmalar vardı. Onlar tüm sorunları ben polimorfik kısıtlamaları eksikliği indirgenebilir açıklanan gösterdi.

Bu sorunun en basit örnek MonadPlus sınıfı olarak tanımlanır:

class MonadPlus m where
    mzero :: m a
    mplus :: m a -> m a -> m a

... aşağıdaki yasalar ile

mzero `mplus` m = m

m `mplus` mzero = m

(m1 `mplus` m2) `mplus` m3 = m1 `mplus` (m2 `mplus` m3)

Bu Monoid sınıf verilen yerlerde Monoid kanunlara, dikkat edin:

class Monoid a where
    mempty :: a
    mappend :: a -> a -> a

mempty `mplus` a = a

a `mplus` mempty = a

(a1 `mplus` a2) `mplus` a3 = a1 `mplus` (a2 `mplus` a3)

Neden MonadPlus sınıfı var mı? Nedeni Haskell formu kısıtlamaları yazmaktan bize yasaklıyor çünkü

(forall a . Monoid (m a)) => ...

Yani Haskell programcılar bu özel polimorfik davayla ilgilenmesi için ayrı bir sınıf türü sisteminin bu kusur geçici bir çözüm bulmak zorundadır.

Ancak, bu her zaman geçerli bir çözüm değil. pipes kütüphane kendi işimde örneğin, ben sık sık form kısıtlamaları poz ihtiyacı karşılaştı:

(forall a' a b' b . Monad (p a a' b' b m)) => ...

Aksine MonadPlus çözüm, ben bunu göze alamaz geçmek Monad tip sınıfı için farklı bir sınıf almak polimorfik sınırlama sorunu çünkü o kullanıcı benim kütüphane kaybetmesine yol açacak do gösterimde olan bir yüksek fiyat ödemek.

Bu da transformers, hem monad transformatörler ve kütüphaneme dahil ettiğim proxy transformers oluştururken geliyor. Böyle bir şey yazmak istiyorum:

data Compose t1 t2 m r = C (t1 (t2 m) r)

instance (MonadTrans t1, MonadTrans t2) => MonadTrans (Compose t1 t2) where
    lift = C . lift . lift

Bu ilk girişimi lift Monad olması sonucu kısıtlamak değil, çünkü işe yaramıyor. Aslında ihtiyacımız olacak:

class (forall m . Monad m => Monad (t m)) => MonadTrans t where
    lift :: (Monad m) => m r -> t m r

... ama Haskell'ın kısıtlama sistemi buna izin vermez.

Bu sorun, Haskell, kullanıcıların hareket halindeyken daha belirgin daha yüksek tür tür markalar büyüyecek. Tipik olarak, bir tür sınıf olacak:

class SomeClass someHigherKindedTypeConstructor where
    ...

... ama sınırlamak için isteyeceksiniz düşük kinded bazı türetilmiş bir tür kurucu:

class (SomeConstraint (someHigherKindedTypeConstructor a b c))
    => SomeClass someHigherKindedTypeConstructor where
    ...

Ancak, polimorfik bir kısıtlama olmaksızın, kısıtlama yasal değildir. Bu son zamanlarda pipes benim kütüphane çok yüksek her tür kullanır, çünkü bu sorun hakkında en çok şikayette bulundum, bu sorunla sürekli karşılaşıyorum.

Orada geçici çözümler kullanarak veri türleri birkaç kişi önerdi bana ama ben unutmadım (henüz) zamanları değerlendirmek için onları anlamak uzantıları gerektiren ya da hangisini çözdü sorunumu doğru. Biri daha tanıdık bu konuda belki ayrı bir cevap çalışıyor neden bu çözüm detaylandırma ve sağlayabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dylan Brenan

    Dylan Brenan

    22 Aralık 2009
  • Hollyscoop

    Hollyscoop

    30 Ocak 2007
  • SuppressedStorm

    SuppressedSt

    11 AĞUSTOS 2013