SORU
13 AĞUSTOS 2013, Salı


Haskell Tür vs Veri Kurucu

Learnyouahaskell.com Haskell dan öğreniyorum ve sorun türü kurucular ve veri kurucular anlama yaşıyorum. Örneğin, gerçekten bu arasındaki farkı anlamıyorum:

data Car = Car { company :: String  
               , model :: String  
               , year :: Int  
               } deriving (Show) 

ve bu:

data Car a b c = Car { company :: a  
                     , model :: b  
                     , year :: c   
                     } deriving (Show)  

İlk sadece bir kurucu kullanarak anlıyorum ("") Araba için bir Araba inşa edilen veriler. Gerçekten ikinci bir anlamıyorum.

Ayrıca, ne kadar veri türleri bu gibi tanımlanmış yapın:

data Color = Blue | Green | Red

bu olaya? Anladığım kadarıyla, üçüncü örnek (Renk) üç eyalette olabilir hangi türü: Mavi, Yeşil veya Kırmızı. Ama ilk 2 örnek anlıyorum nasıl çakışıyor: yazın Araba sadece bir durumda olabilir, "çeşitli parametreleri oluşturmak için alabilir mi?", Araba Eğer öyleyse, nasıl ikinci örnek uyuşuyor mu?

Aslında, yapıları/yukarıdaki üç kod örnekleri bir araya getiren bir açıklama arıyorum.

Eğer anlamıyorum ne hakkında daha belirtmek istiyorum, yorum söyle.

CEVAP
13 AĞUSTOS 2013, Salı


data bildiride, birtip kurucuSol tarafta şey eşittir.veri yapıcı(ler)sağ tarafta olan şeyler eşittir. Bir tür beklenen ve değeri beklenen veri kurucular kullandığınız tür markalar kullanın.

Veri kurucular

Daha basit bir renk gösteren bir Türüne bir örnek ile başlayabiliriz.

data Colour = Red | Green | Blue

Burada, üç veri kurucular var. Colour bir türüdür ve Green türünde bir değer Colour içeren bir kurucu. Benzer şekilde, Red Blue tip değerleri Colour yapı hem kurucular. Ama renklendirmeyi hayal edebiliriz!

data Colour = RGB Int Int Int

Biz hala* *27 ama RGB bir değerdir sadece bu tip bir işlevi üç değer vermez alıyordönüyorbir değer! RGB türü vardır

RGB :: Int -> Int -> Int -> Colour

RGB bir fonksiyonu alarak bir veri yapıcıdeğerleronun argüman olarak, ve daha sonra yeni bir değer oluşturmak için kullanır. Eğer nesne yönelimli programlama yaptıysanız, bunu anlaman gerekir. OOP, kurucular aynı zamanda bağımsız değişken olarak bazı değerleri almak ve yeni bir değer döndürmek!

Eğer üç değer için RGB uygularsak, bu durumda, bir renk değerini alırız!

Prelude> RGB 12 92 27
#0c5c1b

Varbir değeri inşa34 ** veri kurucu uygulayarak türü. Veri kurucu ya da bir değişkeni gibi bir değeri içeren, ya da argüman olarak başka değerler alır ve yeni bir oluştururdeğer. Eğer önceki programlama yaptıysanız, bu kavram size çok garip olmamalı.

Antrakt

Eğer Strings depolamak için bir ikili ağaç oluşturmak istiyorsanız, bir şeyler yapıyor gibi düşünebiliriz

data SBTree = Leaf String
            | Branch String SBTree SBTree

Burada gördüğümüz iki veri kurucular içeren 37* *bir türüdür. Diğer bir deyişle, SBTree türü değerleri inşa edecek iki işlev (yani Leaf Branch) vardır. Eğer ikili ağaçlar nasıl çalıştığını biliyorsanız, sadece dayan. Aslında bu bir şekilde Strings mağazalarında sadece bu ikili ağaçlar nasıl olduğunu bilmeye gerek yok.

Biz de her iki veri kurucular String bir argüman bu ağacında saklamak için gidiyoruz Dize alır.

Ama! Eğer biz de yeni bir ikili ağaç oluşturmak zorundayız Bool, saklamak mümkün olmak istiyordum. Şöyle bir şey olabilir:

data BBTree = Leaf Bool
            | Branch Bool BBTree BBTree

Yazın kurucular

SBTree BBTree her iki tür markalar. Ama bence bir sorun var. Onlar nasıl görüyorsunuz? Bu gerçekten bir yerlerde bir parametre isteyen bir işaret.

Böylece yapabiliriz:

data BTree a = Leaf a
             | Branch a (BTree a) (BTree a)

Biz tanıtmak artıktipi değişkenTürü için bir parametre olarak a kurucu. Bu bildiride, 49* *bir işlevi haline gelmiştir. Bir alıryazınargüman olarak veriryazın.

Burada önemli olan arasındaki farkı dikkate alınmalıdırbeton türü(örnekler Int, [Char] Maybe Bool içerir) programı, ve bir değer atanabilen bir türü olantür yapıcı işlevibir değer atanması edebilmek için bir tür beslemek için ihtiyacınız olan. Değeri hiç bir türü olabilir ""listesi . bir olmalı, çünkü" liste ^em>bir şey". Aynı ruh, bir değer hiç bir türü olabilir "ikili ağaç" ağaç saklamak ikili bir şey olmalı . çünkü", ^em>bir şey".

Eğer biz pass, derseniz, Bool BTree, argüman olarak türünü döndürür Bools saklayan ikili bir ağaç olan BTree Bool,. Bool ve doğru olduğunu nasıl kendiniz görebilirsiniz tip tip değişken a her geçtiği yerde değiştirmek.

Eğer isterseniz, bir fonksiyonu olarak BTree ile görüntüleyebilirsiniztür

BTree :: * -> *

Türlü gibi biraz tür – * beton türü gösterir, BTree beton türü için bir beton türü olduğunu söylüyoruz.

Toparlıyor

Buraya bir an adımı ve benzerlikler dikkat edin.

  • Birveri almıştırbir "0 veya daha fazla . alır fonksiyonudur ^em>değerlerve yeni bir değer geri verir.

  • Birtip kurucubir "0 veya daha fazla . alır fonksiyonudur ^em>türlerive yeni bir tür geri verir.

Parametreleri ile veri kurucular eğer değerlerimizi küçük farklılıklar – parametreler içinde bu varyasyonlar koyduk ve değer koymak için gidiyoruz ne karar verin yaratan adam izin istiyorsak serin. Aynı anlamda parametreleri ile yazın kurucular eğer bizim tip küçük farklılıklar istiyorsak serin! Parametre olarak bu varyasyonlar koyduk ve türünü yaratan adam koymak için gidiyoruz ne karar verelim.

Bir vaka çalışması

Ev streç burada, Maybe a türünü kabul edebiliriz. Bu tanımı

data Maybe a = Nothing
             | Just a

Burada, Maybe beton türü döndüren bir tür kurucu. Just değer döndüren veri yapıcı. Nothing bir değer içeren bir veri yapıcı. Eğer Just, tipine bakarsak bunu görüyoruz

Just :: a -> Maybe a

Diğer bir deyişle, Just 71* *türünde bir değer alır ve türünde bir değer döndürür 72**. Eğer Maybe, tür bakarsak bunu görüyoruz

Maybe :: * -> *

Başka bir deyişle somut bir türü alır ve somut bir türünü verir.

Bir kez daha! Beton türü ve işlevi yapıcı bir tür arasındaki fark. Maybes bir liste oluşturmak mümkün değil. Çalıştırmak için çalışırsanız

[] :: [Maybe]

bir hata alırsınız. Ancak ** 78 Maybe a bir listesini oluşturabilirsiniz. Maybe tür bir yapıcı işlevi olduğundan, ancak bir listesi beton bir tür değerleri içermesi gerekir. Maybe Int Maybe a beton türleri (ya da eğer isterseniz, beton türleri döndüren tür oluşturucu işlevleri için çağrılar.)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • chickenby

    chickenby

    2 HAZİRAN 2008
  • JTechTalk

    JTechTalk

    11 Temmuz 2010
  • Lena Danya

    Lena Danya

    11 NİSAN 2010