mtl, transformers, monads-fd, monadLib ve seçim paradoksu


91

Hackage, monad transformatörler için çeşitli paketlere sahiptir:

  • mtl : Monad trafo kütüphanesi
  • transformatörler : Beton functor ve monad transformatörler
  • monads-fd : İşlevsel bağımlılıkları kullanan Monad sınıfları
  • monads-tf : tür aileleri kullanan Monad sınıfları
  • monadLib : Bir monad transformatör koleksiyonu.
  • mtl-tf : Tip aileleri kullanan Monad trafo kütüphanesi.
  • mmtl : Modüler Monad trafo kitaplığı
  • mtlx : 'ücretsiz' kopyalar sağlayan tip indeksli Monad trafo kitaplığı.
  • compose-trans : Birleştirilebilir monad transformatörler

(ve belki bazılarını özledim)

Hangisini kullanmalıyız?

mtl, Haskell Platformundakidir, ancak reddit'te bunun havasız olduğunu duymaya devam ediyorum.

Ama seçimin nesi kötü, bu sadece iyi bir şey değil mi?

Örneğin, veri erişimcisinin yazarlarının tüm bunları sadece popüler tercihleri ​​karşılamak için nasıl yaptıklarını gördüm:

  • data-accessor-monadLib kütüphanesi: monadLib'in monad'leri için erişimci fonksiyonları
  • data-accessor-monads-fd library: Monads-fd State monad sınıfında duruma erişmek için Accessor'u kullanın
  • data-accessor-monads-tf library: monads-tf State monad türü ailesindeki duruma erişmek için Accessor'u kullanın
  • data-accessor-mtl library: mtl State monad sınıfında duruma erişmek için Accessor'u kullanın
  • veri erişimci-dönüştürücü kitaplığı: Transformatör Durum monad'ındaki duruma erişmek için Erişimci'yi kullanın

Bu devam ederse ve örneğin birkaç rakip Arrow paketi gelişirse, şöyle bir şey görebiliriz: spoonklink-oklar-transformatörler, spoonklink-oklar-monadLib, spoonklink-tfArrows-transformers, spoonklink-tfArrows-monadLib, ...

Ve sonra spoonklink çatallanırsa, Hackage'ın disk alanının biteceğinden endişeleniyorum. :)

Sorular:

  • Neden bu kadar çok monad transformatör paketi var?
  • Mtl [mtl] neden soğuk kabul edilir?
  • Temel farklar nelerdir?
  • Bu görünüşte birbiriyle yarışan paketlerin çoğu Andy Gill tarafından yazılmış ve Ross Paterson tarafından sürdürülüyor. Bu, bu paketlerin rekabet etmediği, bunun yerine bir şekilde birlikte çalıştığı anlamına mı geliyor? Andy ve Ross kendi paketlerinden herhangi birinin modası geçmiş olduğunu düşünüyor mu?
  • Sen ve ben hangisini kullanmalıyız?


2
@Jberryman yorumu için aşağı kaydırın ! Mtl veya transfomer kullanın, uyumlu hale geldiler!
Sophie

Yanıtlar:


70

Birçoğu neredeyse tamamen eşdeğerdir:

  • mtlGHC uzantılarını kullanır, ancak transformersHaskell 98'dir.
  • monads-fdve sırasıyla işlevsel bağımlılıkları ve tür ailelerini kullanan, her ikisi de eksik olan işlevselliği sağlayan monads-tfeklentilerdir .transformersmtltransformers
  • mtl-tfolan mtltip ailelerini kullanarak reimplemented.

Yani esasen mtl== transformers++ monads-fd, mtl-tf== transformers++ monads-tf. Geliştirilmiş taşınabilirlik ve modülerlik transformersve bunlarla ilişkili paketlerin mtlbu günlerde neden soğuk olduğunu düşünüyorum.

mmtlve mtlxher ikisi de mtlAPI farklılıkları ve ekstra özelliklerle benzer ve / veya buna dayanmaktadır .

MonadLibKonulara oldukça farklı bir bakış açısı getiriyor gibi görünüyor, ancak ben doğrudan aşina değilim. Ayrıca diğerlerinden daha çok GHC uzantısı kullanıyor gibi görünüyor.

Bir bakışta compose-transdaha çok monad transformatörleri oluşturmak için metaprogramlama gibi görünüyor. Hangisiyle uyumlu olduğunu iddia ediyor Control.Monad.Trans... Sanırım anlamı mtl?

Her halükarda, aşağıdaki karar algoritmasını öneririm:

  • Yeni bir proje için standart monadlara ihtiyacınız var mı? transformers& Co kullanın , mtldinlenmemize yardım edin .
  • Zaten mtlbüyük bir projede mi kullanıyorsunuz ? transformerstamamen uyumlu değildir, ancak geçiş yapmadığınız için kimse sizi öldürmez.
  • Diğer paketlerden biri ihtiyacınız olan alışılmadık işlevselliği sağlıyor mu? Kendini çevirmektense onu kullanabilirsin.
  • Hâlâ memnun değil misiniz? Hepsini bir kenara atın, indirin category-extrasve dünyanın tüm sorunlarını bir buçuk sayfalık anlaşılmaz soyut, saçma sapan nefes kesici genel kodla çözün .

2
mtl == transformers ++ monads-fd ise, bu şekilde uygulanamaz mı? (değiştirmeye doğru bir aşama olarak) veri erişimcisi-mtl gibi şeylere sahip olma ihtiyacını ortadan
kaldıracak

2
@yairchu: Evet, ama bu konuda ne yapmamı bekliyorsunuz? :) Geriye dönük uyumluluğun sürdürülmesi asla göründüğü kadar kolay değildir ve temel kitaplıkları değiştirmek zaman, çaba ve bir dereceye kadar topluluk desteği gerektirir. Monad trafo durumu bilinen bir sorundur, ancak bunun kimsenin uzun bir çekimde önceliği olduğunu düşünmüyorum.
CA McCann

5
@yairchu: temelde yapılan bu. mtl'nin bir sonraki ana sürümü, transformatörleri + monads-fd'yi içe aktaran bir saplama olmalıdır ve bu sürümle uyumluluk belirleyici faktör olacaktır. Kitaplıklar daha sonra hem mtl 1.1 hem de 1.2 ile uyumlu olacak şekilde ayrı ayrı güncellenebilecek ve daha sonra uygulamalar hangi sürümün yüklü olduğu veya en kısıtlayıcı kitaplık bağımlılıkları tarafından gerekli görülen sürümlere bağlanacaktır.
Edward KMETT

2
Kütüphanelerin posta listesi şu anda MonadIO'yu (ve muhtemelen MonadTrans'ı mtl dışına ve üsse taşımayı tartışıyor. Bununla birlikte, "MonadBase" MPTC'lere, fundepslere vb. İhtiyaç duymasına rağmen MonadIO'nun mı yoksa daha genel bir MonadBase'in mi çıkarılacağına takılı kalmıştır. .
Edward KMETT

28
Bu yazıyı son derece bilgilendirici bulduğumdan beri. Diğer Google çalışanlarını güncelleyeceğimi düşündüm: mtl artık transformatörlere bağlı, monads-fd artık mtl civarında bir saplama. Öyleyse, sahip olduğu ekstra güzelliklere ihtiyacınız varsa mtl kullanın veya ihtiyacınız olan her şeye sahipse sadece transformatörleri içe aktarın.
jberryman

19

Şu an için? Muhtemelen kullanmalısın mtl. Olan şey şu ki, transformerskütüphane, barış içinde bir arada var olabilecek monads-fdve monads-tfbirlikte var olabilecek bir şekilde MTL'den çıkarılıyor , ancak sonunda kontrol bu henüz gerçekleşmedi.

Bu olduğunda , vb . İçin bir takma ad olması dışında (neredeyse) aynı arayüzü içe aktarabilir monads-fdve transformerselde edebilirsiniz .StateStateT

Bu yüzden yazardım mtl, ancak State, Reader, vb .'nin şu anda s dataile değiştirilecekleri gibi olduğu gerçeğine güvenmiyorum type.

MonadLib Iavor'un üzerinde çalışmakta olduğu, herhangi bir modül adını diğerleriyle paylaşmadığı için güvenle kullanılabilen, ancak oldukça farklı bir kullanım modeline sahip bir başka alternatiftir.


4
Hangi anlamda bir arada var olur? Aynı paket tarafından mı kullanılıyor? Aynı modüle mi aktarıldı? Aynı trafo yığınında birleştirildi mi? Fundeps ve TF'leri karıştırmak genel olarak bana kötü bir fikir olarak geliyor. Her neyse, transformers& co'dan çok fazla yararlanmadım . ancak mtlbazı (oldukça basit) bir kodu değiştirirken ve bazı küçük API farklılıklarından başka herhangi bir sorun fark etmedi .
CA McCann

4
Sorun, belirli bir modülü sağlayan yalnızca bir paket yükleyebileceğiniz gerçeğine dayanıyor. Dolayısıyla, dahili olarak bile mtl kullanan bir kitaplık kullanıyorsanız, bir alternatifi içe aktaramazsınız. Şu anda sağlıklı bir hackage yüzdesi, mtl'yi bir şekilde dahili olarak kullanıyor. Birkaç kişi tip aileleri kullanmayı tercih eder ve monads-tf onlara bunu verir, ancak şu anda, transformatörler + monads-fd yeniden düzenleme tamamlanıncaya kadar bu, geçişli olarak MTL gerektiren herhangi bir kütüphaneyi kullanmaktan kodlanan bu kilitlerin kilitlendiğini unutmayın. . Bu, bazı oldukça büyük bilet öğeleri içerir.
Edward KMETT

1
Transformatörleri + monadları (tf | fd) kullanmak uzun vadede bu turşuyu önleyecektir, ancak henüz orada değiliz. Bu arada kullanımın üstünlüğü mtl lehinedir. Yükseltme yolu, mtl'nin bir sonraki ana sürümünün monads-fd ve transformatörleri içe aktaran bir saplama olarak yeniden tanımlanacağı gibi görünüyor. Ana sürüm sonu, cabal dosyanızda hangi sürümü aldığınızı umursamadığınızı (yani Durumun bir tür takma adı veya veri türü olmasını umursamadığınızı) belirtmek için iyi bir yol sağlar ve bu büyük sürüm çarpması gerçekleştiğinde Kullandığınız her kitaplığın aynı önyargıları paylaşması umrunda değil.
Edward KMETT

1
Dolayısıyla, nihayetinde şimdiye kadarki deneyiminiz, transformatörlerin / monadların (tf | fd) desteklemek için tasarlandığı şeydir. Ancak, yazıldıktan sonra fark edilen şey, atlamak için zorlayıcı bir neden ve kalmak için bir sürü eski neden olmadığında, topluluğun kitaplıkları değiştirmede oldukça kötü olduğuydu. Bu nedenle, mtl'yi yeniden tanımlama ve yükseltme yolunu netleştirme ihtiyacı vardır.
Edward KMETT

Harika, detaylı açıklama için teşekkürler! Açıkçası, değiştirdiğim kodun birkaç dış bağımlılığı vardı - çoğunlukla FFI bağları, sanırım. Ayrıca modül adı çatışmalarının bu kadar ... istilacı olduğunu da bilmiyordum, sanırım? Bu gerçekten de işleri tuhaf hale getiriyor. :(
CA McCann

16

Edward Kmett dışarı faktoring bahseder onun cevabı geç 2010. Onun Sonuçta edildi tamamlanmıştır monads-fd üzerine inşa, transformatörler , sürüm 2 haline mtl . Mtl'nin her yerde bulunmasının bir sonucu olarak , monads-tf hiçbir zaman gerçekten yakalandı. 2017'nin başından itibaren, mtl ve transformatörler , yaygın kullanım gören tek monad transformatör kütüphaneleridir.

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.