Neden Haskell (bazen) olarak adlandırılır ve en İyi Zorunlu Dil " quot;mi?
(Bu soru üzerine konu bir cevap aramaya çalıştım ama kesin bir cevap bulamadım ... umarım. Eğer bu konu dışı ya da zaten cevap olur, orta/kaldırın lütfen.)
/Haskell hakkında yarı şaka açıklamayı okumak duyduğumu hatırlıyorumen iyi zorunlu dilelbette garip Haskell gibi sesler birkaç kez, genellikle onun en iyi bilinirfonksiyonelözellikleri.
Benim sorum, ne/özellikleri (varsa) Haskell sebebi Haskell kabul olmanın haklı ver niteliklerien iyi zorunlu dilya aslında bir şaka daha.
CEVAP
Yarı gerçek bir düşünün. Soyut Haskell için inanılmaz bir yeteneği vardır, ve zorunlu fikir soyutlama içerir. Örneğin, Haskell dahili şart döngü sırasında yok, ama sadece yazabiliriz ve şimdi yapıyor
while :: (Monad m) => m Bool -> m () -> m ()
while cond action = do
c <- cond
if c
then action >> while cond action
else return ()
Soyutlama bu seviyede çok zorunlu diller için zordur. Bu kilitler; örneğin olması şart dilde yapılabilir. Python ve C#.
Ama Haskell da (son derece) eşsiz bir yeteneği varyan etkileri izin veriyor, Monad sınıfları kullanarak. Eğer bir işlevi varsa, örneğin,:
foo :: (MonadWriter [String] m) => m Int
Bu bir "" iÅŸlevi, ama sadece iki ÅŸey yapabilir.. ÅŸart olabilir
- "Çıkış" dizeleri akışı
- bir İnt döndürür
Ya da ağ bağlantıları, vb konsol kurulması için baskı yapamaz. Hareket soyutlama yeteneği, fonksiyonlar yazabilirsiniz ile birlikte "bir akım üreten herhangi bir hesaplama", vb.
Gerçekten tüm hakkında Haskell çok güzel bir dil zorunlu kılan soyutlama yetenekleri var.
Ancak, yanlış yarısı sözdizimi. Haskell oldukça ayrıntılı ve garip buyurgan bir üslup bulmak için kullanabilirsiniz. Burada hesaplama kullanarak bir bağlı listenin son elemanı bulur while
döngü, yukarıda bir örnek şart tarzı:
lastElt :: [a] -> IO a
lastElt [] = fail "Empty list!!"
lastElt xs = do
lst <- newIORef xs
ret <- newIORef (head xs)
while (not . null <$> readIORef lst) $ do
(x:xs) <- readIORef lst
writeIORef lst xs
writeIORef ret x
readIORef ret
Tüm bu İORef çöp, çift okumak zorunda bağlama sonucu bir okuyun, fmapping (<$>
) ameliyat sonucu bir satır içi hesaplama... her şey çok karmaşık görünüyor. Bir anlamda bir sürü yaparfonksiyonelbakış açısı, ama zorunlu dil halının altına süpürüp bu ayrıntıları çoğu bunları kullanmak için daha kolay hale getirmek için eğilimindedir.
EÄŸer while
tarzı farklı bir kombinatorik kullansak hiç kuşkusuz, belki de daha temiz olurdu. Ama eğer bu felsefeyi yeterince alırsan (combinators zengin bir set kendini açıkça ifade etmek için), sonra fonksiyonel programlama tekrar geliyor. Zorunlu tarzı sadece Haskell "" iyi tasarlanmış bir zorunlu dil, örneğin python. gibi bir akış yok
-Yüz germe bir cümle ile sonuç olarak, Haskell en iyi şart dili olabilir. Ama, yüz gerdirme doğası gereği, bir şeyi içten ve güzel bir şey ile gerçek dıştan güzel ve sahte değiştirilmesi olacaktır.
EDİTBu python çevirisi ile kontrast lastElt
:
def last_elt(xs):
assert xs, "Empty list!!"
lst = xs
ret = xs.head
while lst:
ret = lst.head
lst = lst.tail
return ret
Çizgiler aynı sayıda, ama her satırı daha çok gürültü vardır.
2 DÃœZENLEYÄ°N
Ne, bu nasıl birsafHaskell değiştirme gibi görünüyor:
lastElt = return . last
Ä°ÅŸte bu kadar. Ya da, eÄŸer Prelude.last
kullanarak beni senden korusun:
lastElt [] = fail "Unsafe lastElt called on empty list"
lastElt [x] = return x
lastElt (_:xs) = lastElt xs
Ya da, eÄŸer Foldable
herhangi bir veri yapısı üzerinde çalışmak ve aslında olmadığını tanımak istiyorsanızgerekIO
hataları işlemek için:
import Data.Foldable (Foldable, foldMap)
import Data.Monoid (Monoid(..), Last(..))
lastElt :: (Foldable t) => t a -> Maybe a
lastElt = getLast . foldMap (Last . Just)
Map
, örneğin:
λ➔ let example = fromList [(10, "spam"), (50, "eggs"), (20, "ham")] :: Map Int String
λ➔ lastElt example
Just "eggs"
(.)
operatör function composition.
Neden &; ad std quot;" kötü olara...
Neden C ön işlemci word "linux&qu...
Neden oluştur "Örtülü olarak Opti...
Neden ReSharper söyle&; örtülü olarak ...
Neden C-yakalama-deÄŸeri 0 x'in la...