SORU
13 HAZİRAN 2009, CUMARTESİ


Türü açısından Haskell tür vs newtype güvenlik

newtype Haskell daha sık data göre olduğunu biliyorum ama teknik bir sorun olarak daha bakış açısı; bir tasarım daha bu karşılaştırma irdeliyorum.

İçinde imperitive/OO diller, anti-desen "primitive obsession" nerede verimli kullanımı basit türler azaltır bu tür bir güvenlik programı ve tanıtır yanlışlıkla olmuştur. aynı yazılan değerler, aksi takdirde amaçlanan değişik amaçlar için. Örneğin, birçok şey olabilir bir Dize, ama güzel olurdu, eğer bir derleyici var, statik olarak, hangi biz demek için bir isim ve biz demek için şehirde bir adres.

Ne sıklıkta, Haskell programcılar newtype aksi takdirde ilkel değerlere tür ayrımlar vermek için kullanır mı? type kullanımı bir diğer tanıtır ve bir programın okunabilirliği verir daha net anlambilim, ama yanlışlıkla değerleri etkileşimler engellemez. Haskell öğrenmek gibi yazın sistem herhangi rastlamak kadar güçlü olduğunu fark ettim. Bu nedenle, bu doğal ve yaygın bir uygulama olduğunu düşünürdüm, ama bu ışık newtype kullanımı çok ya da herhangi bir tartışma görmedim.

Programcılar bir sürü farklı şeyler yapmak elbette, ama bu hiç haskell yaygındır?

CEVAP
10 EKİM 2010, Pazar


Newtypes için ana kullanır:

  1. Türleri için alternatif örneklerini tanımlamak için.
  2. Belgeler.
  3. Data/format doğruluğu güvence.

Hangi newtypes yoğun kullandığım bir uygulama şu an üzerinde çalışıyorum. Haskell newtypes tamamen-derleme kavram. E. g. unwrappers aşağıda, unFilename (Filename "x") aynı kod olarak derlenmiş olan "x". Sıfır çalıştırma darbe kesinlikle yoktur. data türleri vardır. Bu çok güzel yukarıda belirtilen hedeflere ulaşmak için bir yoldur.

-- | A file name (not a file path).
newtype Filename = Filename { unFilename :: String }
    deriving (Show,Eq)

Yanlışlıkla bir dosya yolu olarak bu tedavi etmek istemiyorum. Dosya yolu değil. Kavramsal bir dosya bir yere veritabanı adını.

Algoritmalar doğru olanı ifade etmek için çok önemli, bu konuda yardımcı newtypes. Güvenlik, örneğin, bir web uygulaması için dosya yükleme düşünün için de çok önemli. Bu tür var:

-- | A sanitized (safe) filename.
newtype SanitizedFilename = 
  SanitizedFilename { unSafe :: String } deriving Show

-- | Unique, sanitized filename.
newtype UniqueFilename =
  UniqueFilename { unUnique :: SanitizedFilename } deriving Show

-- | An uploaded file.
data File = File {
   file_name     :: String         -- ^ Uploaded file.
  ,file_location :: UniqueFilename -- ^ Saved location.
  ,file_type     :: String         -- ^ File type.
  } deriving (Show)

Gönderilmiş bir dosyadan bir dosya adı temizler: bu fonksiyonu var sanırım

-- | Sanitize a filename for saving to upload directory.
sanitizeFilename :: String            -- ^ Arbitrary filename.
                 -> SanitizedFilename -- ^ Sanitized filename.
sanitizeFilename = SanitizedFilename . filter ok where 
  ok c = isDigit c || isLetter c || elem c "-_."

Şimdi bu benzersiz bir dosya adı oluşturmak:

-- | Generate a unique filename.
uniqueFilename :: SanitizedFilename -- ^ Sanitized filename.
               -> IO UniqueFilename -- ^ Unique filename.

Tehlikeli ilk arındırılmış olmalıdır rastgele bir dosya adı, benzersiz bir dosya adı oluşturmak için. Aynı şekilde, benzersiz bir dosya adı uzantısı her zaman güvenli böylece. Eğer istersem dosyayı diske kaydet ve şimdi benim veritabanında bir dosya koyabilirsiniz.

Ama aynı zamanda/çok kaydırma kaydırmak için can sıkıcı olabilir. Uzun vadede, özellikle kaçınarak değer uyuşmazlıklar için o kadar değer görüyorum. ViewPatterns yardım biraz:

-- | Get the form fields for a form.
formFields :: ConferenceId -> Controller [Field]
formFields (unConferenceId -> cid) = getFields where
   ... code using cid ..

Belki de bir işlevi açılması bir sorun, eğer bir fonksiyon için cid yanlış geçirirseniz ne olduğunu söyleyecek misin? Sorun değil, tüm fonksiyonları bir konferans kimliğini kullanarak Conferenceİd türünü kullanır. Ne çıkar derleme zamanında zorunlu olan işlevi-işlev düzeyinde bir çeşit sözleşme sistemidir. Çok güzel. Evet kullanıyorum elimden geldiğince sık sık, özellikle büyük sistemlerde.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Air_Fooj

    Air_Fooj

    24 NİSAN 2009
  • Exalto_Gamer

    Exalto_Gamer

    15 EKİM 2014
  • SelmerSaxMan

    SelmerSaxMan

    24 HAZİRAN 2006