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
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örlerarr
>>>
yeterli. Hatta basit monadic ayrıca, daha önce gördüğümüz bir işlevadd :: 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ırag
birleştirmek gerekir. Sadece sıralama operatörü kullanılabilir>>>
amaf
g
hakim olmak için doğru tip yok. Nitekimadd
çalışması gerekiyorgiriş kaydedintürb
g
aynı girdi tedarik edebilmek içinf
, SD arasında. Aynı şekildef
sonucu iki sonuç sonunda birlikte eklenebilir ve iade ettimg
, 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.
Yardım anlayış Düzeni Devamı...
Yeni başlayanlar için Haskell veya Sta...
Haskell her şeyi yeniden ihraç...
Argparse Python: Nasıl yardım metindek...
'Haskell haritası anlamı ne, fmap...