İşlevsel tasarım modelleri [kapalı]


106

Çok sayıda işlevsel deyim vardır: monadlar, uygulamalar, oklar, vb. Farklı makalelerde belgelenmiştir ancak maalesef tek bir yerde özetlendikleri herhangi bir kitap veya makale bilmiyorum ( Typeclassopedia var ama çok fazla iyi kaplanmamış alanların sayısı). Herhangi biri, tek bir yerde onları iyi bir şekilde ele alan ve FP konusunda orta düzeyde becerilere sahip bir programcı tarafından erişilebilen bir makale / kitap önerebilir mi?


Sorunuza doğrudan cevap vermiyor ancak bu diğer soruda bazı ilginç bilgiler (ve en azından bir veya iki bağlantı) var: stackoverflow.com/questions/327955/…
reuben

15
Typeclassopedia'nın iyi kapsamadığını düşündüğünüz alanları genişletebilir misiniz?
dave4420

2
@ dave4420 Typeclassopedia'yı baştan sona okursam, ne kadar çok okursam o kadar az anlarım. İlk bölümler gerçekten iyi ama son bölümler benim için pek okunaklı değil.
Konstantin Solomatov

3
@KonstantinSolomatov, anlamadığınız bölümleri araştırmanız, blog yayınlarına bakmanız ve koda dikkatlice bakmanız gerekebilir. tip-sınıftaki tüm bu "tasarım kalıpları" gerçekten soyutlamalardır ve çoğu zaman derin olanlardır, bazen içine girmesi biraz zaman alır.
jberryman

1
@DanBurton, yorumumu yanlış okuyup okumadığından emin değilim, ama hepsini derin soyutlamalar olarak sınıflandırırdım, ancak "Ah ha!" Dediğinizde bunu unutmak kolay olsa da an.
jberryman

Yanıtlar:


35

Benim önerim, Scala öğrenmek istiyorsanız, Paul Chiusano ve Runar Bjarnason'un kitabını okumaktır:

http://manning.com/bjarnason/

Bölüm II: İşlevsel tasarım ve birleştirici kitaplıkları

  1. Küçük diller yapmak
  2. JSON serileştirme
  3. Spesifikasyona dayalı test
  4. Ayrıştırıcılar
  5. Tamamen işlevsel paralellik
  6. Tamamen işlevsel durum

Bölüm III: İşlevsel tasarım modelleri

  1. Soyutlama durumu
  2. Monoidler
  3. Functors
  4. Monadlar
  5. Uygulayıcı işlevciler
  6. Geçilebilir ve katlanabilir veri yapıları
  7. Comonads

Bölüm IV: Kuralları çiğnemek: efektler ve G / Ç

  1. Etkiler ve yan etkiler
  2. Akış işleme ve artımlı G / Ç
  3. Tür sistemiyle etki kapsamını zorunlu kılma

31

Üzgünüm, tüm bu yapıların farklı kullanımlarını ayrıntılı olarak ele alan makaleler veya kitaplar bilmiyorum, ancak size bireysel kaynaklara birkaç bağlantı verebilirim.

Oldukça yaygın bir model, basit monadlar yerine monad transformatörler inşa etmektir (ayrıca bir sonraki paragraftaki bağlantıya bakınız). Temel olarak, diğer monadlarla birleştirilmesi gereken bir şey inşa ettiğiniz ve her ikisinin de özelliklerini idare edebilecek daha karmaşık bir hale getirdiğiniz anlamına gelir.

In Real World Haskell monads hakkında birkaç bölüm vardır. In Bölüm 14. monad'ların Yazarlar temellerini ve bazı ortak kullanımlarını (belki, liste, eyalet) açıklar. Bölüm 15. Monadlarla programlama, bunların nasıl etkili bir şekilde kullanılacağına ilişkin daha fazla açıklama sağlar (okuyucu monadını da kapsar). Aşağıdaki bölümde nasıl kullanılacağı açıklanır parsekten ama aslında nasıl çalıştığını kapsayan makalelerini aramak için daha ilginç olabilir: Bu ayrıştırma için monad'ların iyi organize kullanımının gerçekten iyi bir örnek olmalıdır. Fianlly, Bölüm 18. Monad transformatörlerimonad transformatörlerin nasıl çalıştığını tanıtıyor ve ardından adım adım nasıl yapılacağını gösteriyor. Bölümün son kısımlarına yönelik değerlendirmeler de ilginçtir.

Bir keresinde , monadların yaratıcı kullanımları hakkında SO hakkında gerçekten ilginç bir soru okudum . Önerilen bağlantılar, konuyla ilgili harika okumalardı. Bu ruhla, aynı şeyi oklar için sormaya çalıştım : Kesinlikle monadlardan daha az yanıt aldım, ancak yine de ilginç olanlar.


Dört kişilik çetenin OOP modellerine gelince, İşlevsel düşünme dizilerinde konu hakkında IBM tarafından 3 güzel makale seti var . Hedef fonksiyonel dil Scala'dır. OOP'deki olağan tasarım modellerini açıklayarak ve Scala ile nasıl eşleştiklerini göstererek ilerlerler.

  1. İşlevsel düşünme: İşlevsel tasarım kalıpları, Bölüm 1 . Burada fabrikaları, şablon yöntemlerini, stratejiyi ve uçuş ağırlığını kapsar. Sonuç olarak, birinci sınıf değerler olarak işlevlere sahip olmak, her şeyin çok daha basit olmasıdır.
  2. İşlevsel düşünme: İşlevsel tasarım kalıpları, Bölüm 2 . Bu java ve harika ile ilgili . Adaptör şablonunu adresler.
  3. İşlevsel düşünme: İşlevsel tasarım kalıpları, Bölüm 3 . Burada tercüman kalıbı hakkında konuşuyorlar. Yine, hedef dil harika.

Sorunuzla en ilgili makale elbette ilki, ancak diğer ikisi yine de ilginç ilgili okumalar olabilir.


Teşekkürler, ama Monad, Arrow, Uygulamalı GoF kalıpları gibi farklı desen türlerini kastediyorum.
Konstantin Solomatov

@KonstantinSolomatov: Sorunuzu yanlış anladım, üzgünüm. Monadlar ve oklar için bazı referanslar ekledim.
Riccardo T.

18

Jeremy Gibbons'ın FP blogunda bir Patterns in FP blogu var ve bu da sonunda hemen hemen istediğiniz kitap haline gelecek. Tabii ki, bu henüz isteyebileceğiniz kadar yararlı bir durumda değil, ama biraz cesaretlendirmeyi hak ediyor!

Bu arada Brent Yorgey'nin Typeclassopedia'sına +1 diyeceğim. Gerçekten kullanışlıdır ve daha sonra kafa karıştıran bölümler varsa, bu site bunların altına inmek için iyi bir yerdir. Brent'in incelemede tuttuğunu biliyorum. Okuyucularına ulaşamıyorsa, ona biraz yardım et.



5

Büyük İyilik İçin Bir Haskell Öğrenin'nin sonraki bölümlerini okudunuz mu?

  • Bölüm 6, işlevsel dillerdeki en önemli "tasarım modellerinden" ikisi olan haritaları ve kıvrımları kapsamaktadır.

  • Bölüm 11-13, sırasıyla Functors, Applicative Functors ve Monad'leri kapsar. Bu yararlıdır - birçok öğretici Functors'ı ve ardından Monad'leri tanıtır ve ardından en sonunda Uygulayıcı Functor'ları (eğer hepsini kapsıyorlarsa) yapıştırır. LYAH'daki sıra daha iyidir, çünkü Functors => Applicative Functors => Monadlardan hareket etmek sizi genellik ve güç merdiveninde kademeli olarak yukarı taşır.

  • Bölüm 14 Fermuarları kapsar - bunları, belirli bir veri parçasına bir işaretçiye sahip konteyner sınıfları olarak etkili bir şekilde düşünebilirsiniz, bu da işaretçi konumunda O (1) erişimi ve güncelleme elde edeceğiniz anlamına gelir.

Haskell'de daha ileri düzey bir konu olan Okları veya Komonadları kapsamaz. Okları veya Comonad'ları nasıl ve neden kullanacağınızı anlamak için zaten Monad'ları kesinlikle kavramış olmalısınız, bu yüzden bunun bir sorun olduğunu düşünmüyorum - LYAH, Haskell pazarının başlangıç ​​noktasını hedefliyor.


1
Evet, kitabı okudum. Bunu çok sevdim. Ne yazık ki, okları ve diğer birçok gelişmiş modeli gizlemiyor. Ayrıca Monadlar ve Başvuranlar hakkında daha fazla bilgi edinmek istiyorum (örneğin, LYHGG devam monadını kapsamaz).
Konstantin Solomatov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.