Partiye geç geldiğimin farkındayım, ama burada iki teorik cevabınız vardı ve çiğnemek için pratik bir alternatif sunmak istedim. Buna, yakın zamanda üzerinde çalıştığım bir proje için Arrows konusunda zorla yürüdüğü bir akraba Haskell noob olarak geliyorum.
İlk önce, Haskell'deki çoğu sorunu Oklar'a ulaşmadan verimli bir şekilde çözebilirsiniz. Bazı kayda değer Haskellers onları gerçekten sevmiyor ve kullanmıyor ( burada daha fazla bilgi için buraya , buraya ve buraya bakınız ). Öyleyse kendinize “Hey, bunlara ihtiyacım yok” diyorsanız, gerçekten doğru olabileceğinizi anlayın.
Onları ilk öğrendiğimde oklarla ilgili en sinir bozucu bulduğum şey, konuyla ilgili öğreticilerin kaçınılmaz olarak devre analojisi için ulaştığıydı. Ok koduna bakarsanız - şekerli çeşitlilik, en azından - bir Donanım Tanımlama Dili kadar hiçbir şeye benzemez. Girişleriniz sağda, çıkışlar solda sıralanıyor ve hepsini doğru bir şekilde bağlayamazsanız ateşlenmiyorlar. Kendi kendime düşündüm: Gerçekten mi? Burası bizim bittiğimiz yer mi? Tamamen yüksek seviyede bir dil yarattık mı, bir kez daha bakır tellerden ve lehimlerden oluşuyor mu?
Buna doğru cevap, belirleyebildiğim kadarıyla: Aslında, evet. Şu anda Arrows için katil kullanım davası FRP'dir (genel olarak Yampa'yı, oyunları, müziği ve reaktif sistemleri düşünün). FRP'nin karşılaştığı problem, büyük ölçüde, diğer tüm senkron mesajlaşma sistemlerinin karşı karşıya kaldığı aynı problemdir: sürekli bir girdi akışının, sürekli bir girdi akışına, ilgili bilgiyi veya yayılma sızıntılarını bırakmadan bağlanması. Akışları liste olarak modelleyebilirsiniz - bazı son FRP sistemleri bu yaklaşımı kullanır - ancak çok sayıda giriş varsa, listelerin yönetimi neredeyse imkansız hale gelir. Kendinizi şu anki durumdan yalıtmanız gerekir.
Okların FRP sistemlerinde izin verdiği şey, işlevlerin bir ağa bileşimidir; aynı zamanda, bu işlevler tarafından geçirilen temel değerlere yönelik herhangi bir referansı tamamen ortadan kaldırır. FP'de yeniyseniz, bu başlangıçta kafa karıştırıcı olabilir ve daha sonra bunun etkilerini yutturduğunuzda akıllara durgunluk verebilir. Ancak son zamanlarda, işlevlerin soyutlanabileceği fikrini ve [(*), (+), (-)]
tür gibi bir listenin nasıl anlaşılacağını kabul ettiniz [(a -> a -> a)]
. Oklarla, soyutlamayı bir kat daha ilerletebilirsin.
Bu soyut yetenek, kendi tehlikelerini de beraberinde getiriyor. Birincisi, GHC'yi tip varsayımlarınızdan ne yapacağını bilmediği köşe davalarına itebilir. Tür düzeyinde düşünmeye hazırlıklı olmanız gerekir - bu türler ve RankNTypes ve diğer konular hakkında bilgi edinmek için mükemmel bir fırsattır.
Ayrıca kodlayıcının bazı Ok birleştiricisine ulaştığı yerde “Aptal Ok Dublörleri” olarak adlandırdığım bir takım örnekler var; çünkü o, tüllerle temiz bir numara göstermek istiyor. (İşte deliliğe benim kendi önemsiz katkım .) Vahşi doğada karşılaştığınızda böyle sıcak dogging görmezden çekinmeyin.
NOT: Yukarıda belirttiğim gibi, göreceli bir noob. Yukarıdaki herhangi bir yanılgıyı bildirmişsem, lütfen beni düzeltmekten çekinmeyin.