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
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 fmap
gibi 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!
&Quot nedir;@" sembol Haskell lis...
Ne &; şube" quot;, "tag"...
Kabuk, " nedir; 2>&1 " dem...
Ne demek &; Ara" programı " mı?...
Android "bu hiyerarşi görüşlerini...