SORU
1 Temmuz 2010, PERŞEMBE


Yardım Anlayış Haskell Oklar

Çoğu FRP uygulamaları temelinde oldukları oklar üzerinde bir kavrama almak için çalışıyorum. Sanırım anladığım kadarıyla temel fikir - onlar ile ilgili monadlar ama deposu statik bilgileri her bağlama operatör böylece içinden bir zincir oklar ve bak statik bilgi olmadan değerlendirmek için bütün ok.

Ama biz birinci, ikinci ve takas tartışmaya başladığı noktada kayboldum. Ne 2-dizilerini oklar ile ne ilgisi var? Öğreticiler ise bariz bir sonraki adım sanki demet şeyler mevcut, ama gerçekten bir ilişki göremiyorum. Bu konuda, ok sözdizimi sezgisel olarak ne anlama geliyor?

Teşekkürler.

CEVAP
1 Temmuz 2010, PERŞEMBE


Oklar FRP nasıl çalıştığını açıklıyor http://www.haskell.org/yampa/AFPLectureNotes.pdf, bir göz atın lütfen.

2-dizilerini arrowized bir fonksiyonu 2 argüman alacak temsil etmek için gerekli, çünkü Oklar tanımlamada kullanılır.

CTP, sabitler ve Değişkenler genellikle "giriş", örneğin . onun yok sayan oklar gösterilir

twelve, eleven :: Arrow f => f p Int
twelve = arr (const 12)
eleven = arr (const 11)

Fonksiyon uygulamaları daha sonra besteleri (>>>) dönüştü

# (6-) 12

arr (6-) <<< twelve

Şimdi nasıl 2-değişken bir ok fonksiyonu bir dönüş muyuz? Örneğin

( ) :: Num a => a -> a -> a

tımar nedeniyle bir işlevi, bir fonksiyonu olarak dönen bu tedavi edebiliriz. Bu yüzden

arr ( ) :: (Arrow f, Num a) => f a (a -> a)

şimdi sürekli uygulamak

arr ( )             -- # f     a (a -> a)
  <<< twelve        -- # f b Int
                      :: f b     (Int -> Int)

 ----------        -----        -------------- 
| const 12 |----> | ( ) |  ==  | const (  12) |
 ----------        -----        -------------- 

hey, işe yaramaz bekle. Sonuç yine de bir işlevi döndüren bir ok çıkıyor, ama bir şey f Int Int benzer bekliyoruz.Tımar sadece kompozisyon izin verilir, çünkü Ok başarısız olduğunu görüyoruz.Bu nedenle etmeliyizuncurryişlevi ilk

uncurry :: (a -> b -> c) -> ((a, b) -> c)

uncurry ( ) :: Num a => (a, a) -> a

O zaman oku

(arr.uncurry) ( ) :: (Num a, Arrow f) => f (a, a) a

2-başlığın bu nedenle ortaya çıkar. &&& gibi grup fonksiyonları 2-dizilerini bu ile başa çıkmak için ihtiyaç vardır.

(&&&) :: f a b -> f a d -> f a (b, d)

o zaman ayrıca doğru bir şekilde yapılabilir.

(arr.uncurry) ( )        -- # f   (a,    a) a
  <<<     twelve         -- # f b  Int
      &&& eleven         -- # f b      Int
                           :: f b           a

 -------- 
|const 12|-----.
 --------      |        -----        ---------- 
              &&&====> | ( ) |  ==  | const 23 |
 --------      |        -----        ---------- 
|const 11|-----'
 -------- 

(Şimdi, neden bilmiyoruz fonksiyonları 3 bağımsız olması için 3-dizilerini &&&& gibi şeyler lazım mı? ((a,b),c) yerine kullanılabilir.)


Edit: John Hughes orijinal kağıtOkları Monadlar genellemesebep olarak bunu belirtiyor

4.1 Oklar ve Çiftleri

Ancak, olsa bile durumunda monadlar operatörleri return >>= tüm ihtiyacımız başlamak yararlı kod yazmak için okları benzer operatörler arr >>> yeterli. Hatta basit monadic ayrıca, daha önce gördüğümüz bir işlev

   add :: Monad m => m Int -> m Int -> m Int
   add x y = x >>= \u -> (y >>= \v -> return (u   v))

ancak bir ok şeklinde ifade edilebilir. Bir giriş bağımlılığını açık yapma, benzer bir tanımı formu alması gerektiğini görüyoruz

   add :: Arrow a => a b Int -> a b Int -> a b Int
   add f g = ...

nerede f sıra g birleştirmek gerekir. Sadece sıralama operatörü kullanılabilir >>> ama f g hakim olmak için doğru tip yok. Nitekim add çalışması gerekiyorgiriş kaydedintür b g aynı girdi tedarik edebilmek için f, SD arasında. Aynı şekilde f sonucu iki sonuç sonunda birlikte eklenebilir ve iade ettim g, SD boyunca kaydedilmiş olması gerekir. Ok combinators şu ana kadar gördüğümüz bize başka bir hesaplama arasında bir değer kaydetmek için bir yolu ver, ama başka bir kombinatorik tanıtmak için başka alternatifimiz yok.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • disneychannel

    disneychanne

    19 ŞUBAT 2006
  • iNCH

    iNCH

    20 Temmuz 2009
  • karneson

    karneson

    23 Temmuz 2006