2013-03-01 16 views
7

Monad transformatörlerini kendi küçük kitaplığımı kullanarak mevcut olanların tasarımlarına dayanarak anlamaya çalışıyorum.MTL kütüphanesi hangi dil uzantılarını gerektirir?

Neye takıldığım dil uzantılarıdır. MonadError'da, bahsedilen tek uzantı UndecidableInstances'dur. Ancak, FunctionalDependencies ve FlexibleInstances'u kullanmadan derlemek için benzer kodları alamıyorum.

class (Monad m) => MonadError e m | m -> e where 

Ve esnek örneği:

instance MonadError e m => MonadError e (MaybeT m) where 

nasıl MonadError kod fazladan iki uzantıları önlemek mi İnanıyorum

Örnek FunDeps gerektirir?

cevap

11

Kaynak dosyadaki tüm uzantıları hecelemek zorunda değilsiniz. Tüm/çoğu modül tarafından kullanılan ortak uzantılar, projenin cabal dosyasında listelenebilir. mtl's case yılında:

extensions: 
    MultiParamTypeClasses 
    FunctionalDependencies 
    FlexibleInstances 
+7

Not: Bunu yapabilirsin, ama birçok insan her dosyada 'LANGUAGE' pragmas ile uzantılarını heceleyerek tercih ediyorum. Bu sayede dosyalar bağımsız ve güvenilir olabilir ve her bir dosyanın hangi uzantıları kullandığını görmek kolaydır, çünkü her bir dosya için her uzantıyı açmanız gerekmez. Hangi uzantıları kullandığınıza ve ne kadar yaygın olduğuna bağlıdır. – shachaf

+1

@shachaf: Kesinlikle. İyi bir nokta. Ben de kişisel olarak, bunları kullanan her kaynak dosyadaki her uzantıyı hecelemeyi tercih ederim. – shang

+2

Her ikisi de kullanışlıdır. Önerilen yaklaşımın, bir 'LANGUAGE' pragma kullanılarak dosya başına gerekli uzantıların yazılması ve Cabal'ın' diğer eklentileri 'alanındaki bir paket için gerekli uzantıların kaydedilmesi gerektiğine inanıyorum. “Diğer uzantılar” listesi varsayılan olarak etkin değildir, ancak bir paketin hangi uzantı gereksinimlerini (tüm kaynak dosyalarına ayrı ayrı bakmak zorunda kalmadan) anlamaya hizmet edebilir. – kosmikus