SORU
18 HAZİRAN 2010, Cuma


`Haskell/adalet` sözcüğünü DZD ne yapar?

forall anahtar kelime sözde "" bu: gibi . varoluşsal türleri nasıl kullanıldığını anlamaya başlıyorum

data ShowBox = forall s. Show s => SB s

Bu sadece bir alt kümesi, ancak, forall nasıl kullanılır ve ben sadece bu gibi şeyler: kullanımı etrafında ne yaptıysam aklımı olamaz

runST :: forall a. (forall s. ST s a) -> a

Ya bu farklı ne aradığını açıklıyor:

foo :: (forall a. a -> a) -> (Char,Bool)
bar :: forall a. ((a -> a) -> (Char, Bool))

Ya da RankNTypes tüm şeyler

Net, jargon-ücretsiz İngilizce yerine normal olan dil, her türlü akademik ortamlarda tercih ederim. Bu arama motorları aracılığıyla bulabilirsiniz olanlar) okumak niyetindeyim çoğu bu sorunları var:

  1. Eksik olduklarını gördüm. Onlar açıklamak bir kısmı bu anahtar kelime gibi "varoluşsal türleri"), bu beni rahatlatıyor mutlu kadar okudum kullandığı kod içinde tamamen farklı bir şekilde (gibi runST, foo bar yukarıda).
  2. Bu hafta çok popüler her neyse en son okuduğum yoğun varsayımlar ile yüklüdürler. (Eğer hiç kelime "bakın gazeteyi okuyunher neyseuygulama" yine çok yakında olacak.) detayları için
  3. Sık sık bükülmüş ve kırılmış yılan hikayesi gibi dilbilgisi ve anlambilim içine bile basit kavramlar devre bu şekilde yazılmışlar.

Yani...

Asıl soruya. Hiç kimse tamamen açıklar forall anahtar açık, anlaşılır bir İngilizce (ya da, varsa bir yerlerde, işaret etmek gibi bir açıklama açık olan özledim) yok farz ediyorum bir matematikçi dolu bu jargon?


Düzenlenmiş eklemek için:

Yüksek kaliteli olanlardan stand-out iki cevap aşağıda vardı, ama ne yazık ki sadece en iyi olarak seçebilirim. Norman's answer detaylı ve kullanışlı, aynı zamanda benim pratik sonuçları gösteren forall ve kuramsal temellerini gösterdi bir şekilde bir şeyler anlatmaya çalışıyordu. yairchu's answer kimse belirtilen bir alanı (kapsamlı tür değişkenler) kaplı ve kod ve GHCi bir oturum ile bu kavramların hepsi resimli. Hem de iyi seçmek mümkün olsaydı bunu yapardım. Ne yazık ki yapamam, her iki cevap içinde yakından baktıktan sonra, yairchu biraz kod ve bağlı açıklayıcı açıklama nedeniyle Norman'ın dışarı kenarları olduğuna karar verdim. Bu biraz haksızlık, ancak, çünkü gerçekten ihtiyacım vardı hem de cevaplar için anlamak için bu noktadan o forall gelmez bırak benimle bir soluk duygusunun korku olduğunu gördüğümde bir tür imza.

CEVAP
18 HAZİRAN 2010, Cuma


Hadi bir kod örneği ile başlayalım:

foob :: forall a b. (b -> b) -> b -> (a -> b) -> Maybe a -> b
foob postProcess onNothin onJust mval =
    postProcess val
    where
        val :: b
        val = maybe onNothin onJust mval

Bu kod (sözdizimi hatası) düz Haskell 98 derleme değildir. forall anahtar desteklemek için bir uzantısı gerektirir.

Temelde, 3 vardırfarklıforall anahtar kelime için ortak kullanır (ya da en azından öylegörünüyorher biri kendi Haskell onun uzantısı olan ), ve: *, *, ExistentialQuantificationRankNTypes/*28 26*.

Yukarıdaki kod bu etkin biriyle bir sözdizimi hatası vermez, ama sadece ScopedTypeVariables tip-Çek sağladı.

Tipi Değişken Kapsamı:

Kapsamlı türü değişkenleri where tümceleri içinde kod türlerini belirlemek yardımcı olur. val :: b 32 * aynı foob :: forall a b. (b -> b) -> b -> (a -> b) -> Maybe a -> b 34 *olarak yapar.

Kafa karıştırıcı bir noktaaslında hala örtülü olarak orada bir tür forall atladığınızda bunu duyabilirsiniz. (from Norman's answer: "normally these languages omit the forall from polymorphic types"). Bu iddia doğruamaScopedTypeVariables forall, ve diğer kullanım için değil, ifade eder.

Rank-N-Türleri:

Hadi mayb :: b -> (a -> b) -> Maybe a -> b mayb :: forall a b. b -> (a -> b) -> Maybe a -> b eşdeğer olan ile başlayınhariçScopedTypeVariables etkinleştirildiğinde.

Bu her a b çalıştığı anlamına gelmektedir.

Diyelim ki böyle bir şey yapmak istediğini söyle.

ghci> let putInList x = [x]
ghci> liftTup putInList (5, "Blah")
([5], ["Blah"])

liftTup bu tür olmalıdır? liftTup :: (forall x. x -> f x) -> (a, b) -> (f a, f b). Neden görmek için bu kodu deneyin:

ghci> let liftTup liftFunc (a, b) = (liftFunc a, liftFunc b)
ghci> liftTup (\x -> [x]) (5, "Hello")
    No instance for (Num [Char])
    ...
ghci> -- huh?
ghci> :t liftTup
liftTup :: (t -> t1) -> (t, t) -> (t1, t1)

"Hmm.. neden DZD demet aynı türden iki içermesi gerekir sonucuna? Bir şey olmak zorunda değiller onu söyleyeyim"

-- test.hs
liftTup :: (x -> f x) -> (a, b) -> (f a, f b)
liftTup liftFunc (t, v) = (liftFunc t, liftFunc v)

ghci> :l test.hs
    Couldnt match expected type 'x' against inferred type 'b'
    ...

Hmm. v :: b liftFunc x istediği için burada dzd bize uygulamak izin vermez v liftFunc. Biz gerçekten bizim işlevi, herhangi bir olası x kabul eden bir işlev almak istiyorum!

{-# LANGUAGE RankNTypes #-}
liftTup :: (forall x. x -> f x) -> (a, b) -> (f a, f b)
liftTup liftFunc (t, v) = (liftFunc t, liftFunc v)

Tüm çalışan liftTup değil x, yok olur değil işlevi.

Varoluşsal Ölçümü:

Hadi bir örnek:

-- test.hs
{-# LANGUAGE ExistentialQuantification #-}
data EQList = forall a. EQList [a]
eqListLen :: EQList -> Int
eqListLen (EQList x) = length x

ghci> :l test.hs
ghci> eqListLen $ EQList ["Hello", "World"]
2

Nasıl Rütbe-N-Türlerinden farkı nedir?

ghci> :set -XRankNTypes
ghci> length (["Hello", "World"] :: forall a. [a])
    Couldnt match expected type 'a' against inferred type '[Char]'
    ...

-N-Rütbe Türleri forall a ifade as mümkün olan tüm uygun olmalıdır anlamına geliyordu. Örneğin:

ghci> length ([] :: forall a. [a])
0

Boş bir liste herhangi bir liste olarak çalışır.

Bu yüzden Varoluşsal-Ölçümü ile, foralldata tanımlarında yani bu s, değeri içeriyorduolabilirolabilirherhangi biruygun tip değilgerekirolabilirtümuygun türleri.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • campos9896

    campos9896

    24 Mart 2012
  • hotstrikegently

    hotstrikegen

    26 AĞUSTOS 2011
  • Julian Smith

    Julian Smith

    31 EKİM 2006