SORU
8 Temmuz 2011, Cuma


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
8 Temmuz 2011, Cuma


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 whiletarzı 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.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jesse Pimenta

    Jesse Piment

    5 EKİM 2011
  • Lamarr Wilson

    Lamarr Wilso

    27 Aralık 2008
  • Matt Steffanina

    Matt Steffan

    1 EYLÜL 2011