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
Newtypes için ana kullanır:
- Türleri için alternatif örneklerini tanımlamak için.
- Belgeler.
- 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.
Güvenlik türü: Kontrolsüz dökme...
Haskell sonsuz bir liste açısından tem...
Herkesin görebileceği bir türü için XM...
Bir RSS beslemesi kullanmak için doğru...
nasıl bir öğe türü jquery kullanarak d...