SORU
15 Mayıs 2009, Cuma


Neden veri türleri "kapalı" Haskell cebirsel?

Eğer yanılıyorsam beni Düzelt, ama Haskell cebirsel veri türleri OO dillerde sınıflar ve miras kullanacağınız durumlarda çok yararlı gibi görünüyor. Cebirsel veri türü olarak ilan edildikten sonra, başka bir yerde uzatılabilir. ama büyük bir fark var: "Kapalı". OO, zaten tanımlanmış sınıfları uzatabilirsiniz. Örneğin:

data Maybe a = Nothing | Just a

Nedense bu tür için başka bir seçenek daha sonra bu Bildirge değiştirmeden ekleyebilirim bu şekilde yok. Bu sistemin avantajları nelerdir? OO bu sayede çok daha genişletilebilir olacak gibi görünüyor.

CEVAP
15 Mayıs 2009, Cuma


ADT kapalı olması çok daha kolay toplam fonksiyonları yazmak için yapar. O her zaman bir sonucu üreten fonksiyonlar, türünün tüm olası değerleri için, örn.

maybeToList :: Maybe a -> [a]
maybeToList Nothing  = []
maybeToList (Just x) = [x]

Eğer Maybe açık olsaydı, birisi ekstra bir kurucu ekleyebilirsiniz maybeToList işlevi birden kıracak.

İçinde OO bu değil sorun, ne zaman kullanıyorsun miras uzanan bir tür, çünkü ne zaman seni aramak için bir işlevi olan yok belirli bir yük olabilir sadece uygulama için bir üst sınıf. I. e., printPerson(Person p) Student Person C Student bir nesne ile gayet iyi diyebilirsin.

Haskell, genellikle ölçüde türleri ihtiyacınız olduğunda saklama ve tip sınıfları kullanırsınız. Örneğin:

class Eq a where
   (==) :: a -> a -> Bool

instance Eq Bool where
  False == False = True
  False == True  = False
  True  == False = False
  True  == True  = True

instance Eq a => Eq [a] where
  []     == []     = True
  (x:xs) == (y:ys) = x == y && xs == ys
  _      == _      = False

Şimdi, == işlevini tamamen açık, Eq sınıfının bir örneğini yaparak kendi türleri ekleyebilirsiniz.

< / ^ hr .

Kesinlikle Haskell bir parçası değil, henüz extensible datatypes ama fikri üzerinde çalışmak olduğunu unutmayın.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Capcom Unity

    Capcom Unity

    5 NİSAN 2010
  • Caramella Girls

    Caramella Gi

    19 Mayıs 2008
  • ipsy

    ipsy

    1 EKİM 2012