SORU
15 EYLÜL 2013, Pazar


Haskell "Sadece" sözdizimi ne demek?

Bu anahtar kelime ne gerçek bir açıklama için internette araştırdım. Her Haskell başlar rastgele kullanmadan baktım öğretici ve asla ne yaptığını açıklar (ve birçok baktım).

Burada Sadece kullanan Real World Haskell kodu temel bir parça. Kod mu ne, ama bir amaç ya da işlev "Sadece" değildir. ne olduğunu bilmiyorum anladığım kadarıyla

lend amount balance = let reserve    = 100
                      newBalance = balance - amount
                  in if balance < reserve
                     then Nothing
                     else Just newBalance

Gözlemlediğim kadarıyla, "" yazarak, ama öğrenmek için başardım sayılır. Belki ilgilidir

Sadece ne anlama geldiğini daha iyi bir açıklama çok mutluluk duyacağız.

CEVAP
15 EYLÜL 2013, Pazar


Aslında tanımlanmış olan sadece normal bir tip yapıcıBaşlangıcıotomatik olarak her modüle alınan standart kütüphane.

Belki nedir, Yapısal olarak

Tanımı şöyle görünür:

data Maybe a = Just a
             | Nothing

Bu beyan türü bir değişken parametreli olan bir türü, Maybe a tanımlar a yerine herhangi bir türü ile kullanabileceğiniz anlamına gelir a,.

İnşa ve Tahrip

Bu tip iki kurucular vardır, Just a Nothing. Bir tür Çoklu kurucular, türünde bir değer mümkün kurucular sadece bir bina gerektiği anlamına gelir. Bu tür için bir değer ya da Just ile inşa edilmiştir veya Nothing, Diğer (non-hata) olanakları vardır.

Nothing parametre türü vardır beri, yapıcı olarak kullanıldıĞında tüm türleri a türü Maybe a üyesi olduğu sabit bir değer isimler. Ama Just kurucu mu var, Bir tür parametresi, yani o zaman kullanılan bir yapıcı davranır gibi bir işlevi türü a Maybe a, yani sahip olduğu tip a -> Maybe a

Yani, bir tür markalar bu tür bir değer oluşturmak; başka şeylerin yanı sıra bu değeri kullanmak istediğiniz zaman, desen eşleştirme oynamak için giriyor. İşlevleri farklı olarak, kurucular desen bağlayıcı ifadelerde kullanılabilir, ve bu da yapabilirsinvaka analizibirden fazla kurucu ile türlerine ait değerler.

Bir desen eşleşmesi Maybe a bir değer kullanmak için, her kurucu için bir model, bu yüzden gibi sağlamanız gerekir:

case maybeVal of
    Nothing   -> "There is nothing!"
    Just val  -> "There is a value, and it is "    (show val)

Bu durumda ifade, ilk desen eğer değer Nothing, olsaydı maç olur ve ikincisi ise değer Just ile inşa edilmiştir eğer maç olur. Eğer ikinci bir maç varsa, o da karşı eşleşen konum değeri ne zaman yapıldığını Just kurucu için geçirilen parametre adı val bağlar.

Belki De Ne Demek

Belki de zaten bu işe ne kadar aşina olduğunuzu; gerçekten Maybe değerleri için herhangi bir sihir yok, sadece normal Haskell Cebirsel Veri Tipi (ADT). Ama eskiden biraz çünkü etkili bir şekilde "Asansör" ya uzanan bir tür, gibi Integer örnek, yeni bir bağlamda hangi bir ekstra değer (Nothing) gösteren bir eksikliği değer! Yazın sistem Integer bunu alayım önce bu ekstra değer için kontrol etmeniz gerekirolabilirorada olmak. Bu hataların ciddi bir kısmını engeller.

Dilleri bugün bu tür işlemek pek çok "değer" NULL referanslar üzerinden değer. Tony Hoare, önde gelen bilgisayar bilimci (Quicksort icat etti ve Turing Ödülü kazanan), onun 70 ** bu kadar var. Belki yazın bunu düzeltmek için tek yol değil, ama bunu yapmak için etkili bir yol olduğu kanıtlanmıştır.

Belki bir Functor

Eski tip olabilir işlemleri gibi başka bir tür dönüştürme fikriniayrıcaHaskell tür sınıf Maybe a yararlı bir örneği olan Functor denilen arkasında kavramı yeni bir tür üzerinde çalışmak için dönüştürülebilir.

Functor sağlar adında bir yöntem fmap, haritalar fonksiyonları bu değerler, taban türü (gibi Integer) işlevleri bu değerler itibaren kaldırdı türü (gibi Maybe Integer). Bir fonksiyonu fmap Maybe değeri üzerinde çalışmaya dönüştürdü bu gibi çalışır:

case maybeVal of
  Nothing  -> Nothing         -- there is nothing, so just return Nothing
  Just val -> Just (f val)    -- there is a value, so apply the function to it

Bu yüzden, varsa bir Maybe Integer değer m_x Int -> Int fonksiyonu f yapabilirsiniz fmap f m_x için geçerli işlevi f doğrudan Maybe Integer olmadan endişe Eğer gerçekten bir değer ya da değil. Aslında Maybe Integer değerlere Integer -> Integer fonksiyonlar kaldırdı bütün bir zincir uygulamak ve sadece bittiğinde açıkça Nothing için bir kez kontrol konusunda endişelenmenize gerek.

Belki bir Monad

Emin değilim ne kadar tanıdık kavramı ile bir Monad henüz, ama en az kullanılan IO a daha önce bu tür imza IO a görünüyor oldukça benzer Maybe a. Ancak IO özel olarak bu değil ortaya kendi kurucular için ve böylece sadece "Çalıştır" tarafından Haskell çalışma sistemi var, hala da bir Functor yanında olmak Monad. Aslında, hangi Monad sadece bazı ekstra özellikleri ile Functor özel bir tür önemli bir anlamı var, ama bunun yeri değil.

Neyse, Monadlar gibi IO harita türleri için yeni türleri temsil "hesaplamalar sonucu değerleri" ve asansör özellikleri Monad tipte bir çok fmapgibi fonksiyonu liftM görünen o ki normal bir işlev bir "hesaplama sonuçlarında elde edilen değer ile değerlendirme işlevi."

Maybe Monad olduğunu sizin de tahmin edebileceğiniz eğer bu kadar okudum (eğer varsa). Temsil "bir değer döndürmek için başarısız olabilir hesaplamaları". Gibi fmap bu örnek, bu açıkça her adımdan sonra hatalar için kontrol etmek zorunda kalmadan hesaplamaları bir sürü yapmanızı sağlar. Ve aslında, yol Monad örnek inşa edilmiştir, Maybe bir hesaplama değerleridururNothing karşılaşıldığında en kısa sürede, bu kadar çeşit bir hesaplama ortasında ani bir iptal ya da değersiz bir dönüş gibi.

Belki Yazılmış Olabilir

Gibi, hiçbir şey dil yazım veya çalışma zamanı sistemi içine pişmiş olan Maybe türü doğasında var daha önce de söyledim. Eğer Haskell varsayılan olarak vermedi bile, işlevselliği tüm kendiniz yaratabilirsiniz! Açıkçası, bir daha kendini yine de, farklı isimlerle, yazma ve aynı işlevselliği elde edebilirsiniz.

Umarım Maybe türü ve kurucular şimdi anlıyorum, ama eğer hala belirsiz bir şey varsa, bana bildirin!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Engadget

    Engadget

    18 EYLÜL 2006
  • Jason Parker

    Jason Parker

    14 Aralık 2009
  • Truc Minh

    Truc Minh

    23 Ocak 2011