2013-04-17 13 views
9

Benim kodunda bu tür bir şey yapıyordu:Belki ile sarmak yerine cebirsel veri türü ile nullary kurucu kullanın?

data MyType = Cons1 a b 
data OtherType = OtherType 
      { val1 :: Int 
      , val2 :: String 
      , val3 :: Maybe MyType 
      } 

ve buna kodu değiştirmeden olurdu acaba kıvrımlara/basit ve artı/eksi ne:

data MyType = Cons1 a b | Missing 
data OtherType = OtherType 
      { val1 :: Int 
      , val2 :: String 
      , val3 :: MyType 
      } 

Yaptığım şey bir dosyadan [OtherType] içine satırları okumaktır, her satırda sütun 3 ve 4'ün val3 :: MyType oluşturmak için kullanıldığını söyleyen 4 sütun vardır. Şu anda, readMaybe'yi a ve b'yi okumak için kullanıyorum ve sonra Onlardan yalnızca biriyse ve sadece b ise bir şey yoksa Hiçbiri mi yoksa Sadece bir tane mi? Bunun yerine Kaybını döndürmek için değiştirebileceğimi düşünüyordum, böylece bir kat sargıyı kaldırarak. hepsi MyType değerleri Missing olasılığını olması açısından anlamlı olup olmadığını

cevap

10

Orada ikinci yaklaşımın iki küçük avantajları şunlardır:

  1. dolaylama, yazdığınız fonksiyonları bir seviyede kesmek By ve OtherType bu çapraz değerleri genellikle biraz daha basit (ama olağanüstü) olurlar.
  2. Kodunuzu eklediğiniz nuller yapıcı için iyi bir ad seçerek daha fazla kendi kendine açıklayıcı olabilir (çeşitli yerlerde Nothing adının genel kullanımına kıyasla).

büyük bir dezavantajı standart kitaplıklar Maybe-değerlerinin çalışmak vermek tüm önceden tanımlanmış fonksiyonlar kullanma hakkını kaybedebilir olduğunu ve ilişkili işlevsellik kodu kendiniz zorunda olmasıdır.

+0

OtherType defs sabitlendi – flimbar

22

Yalnızca MyType için Missing yapıcı eklemek gerekir. MyType değerleriyle ilgili tüm işlevlerde Missing'u işlemeniz gerekir. Bunların büyük çoğunluğu toplamı içermiyorsa - bir hata atın veya aksi halde başarısız olursa - Missing açıkça MyType'a ait değildir ve bunun yerine Maybe MyType'u kullanmalısınız.

Basitçe şunu belirtin: eğer isteğe bağlı tür içeriğe sahipse, onu türünde kodlayın. Aksi halde, ayrı tutunuz.

+12

N.B. Bu, "önemsiz" ilkesinin özel bir örneğidir: bir veri türü tasarlarken, tamamen temsil edilemeyen bir anlam ifade etmeyin - Haskell'e göre olası değerleri, modelinizdeki olası değerler ile tam olarak aynı yapın . – luqui