2013-03-01 14 views
7

私はモナド変圧器を、既存のものの設計に基づいて自分の小さなライブラリを実装することによって理解しようとしています。MTLライブラリにはどのような言語拡張が必要ですか?

私が立ち往生しているのは、言語拡張です。 MonadErrorに記載されている唯一の拡張子はUndecidableInstancesです。しかし、同様のコードをFunctionalDependenciesFlexibleInstancesも使用せずにコンパイルすることはできません。私は信じていることを

例FunDepsが必要です。

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

と柔軟なインスタンス:

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

MonadErrorコードの余分な2つの拡張を回避しない方法は?

答えて

11

ソースファイル自体のすべての拡張子を綴る必要はありません。すべての/ほとんどのモジュールで使用される共通の拡張機能は、プロジェクトのカバールファイルに一覧表示できます。 mtl's caseで:

extensions: 
    MultiParamTypeClasses 
    FunctionalDependencies 
    FlexibleInstances 
+7

注:この操作を行うことができますが、多くの人々がそれぞれのファイルで 'LANGUAGE'プラグマと拡張を綴ることを好みます。こうすることで、ファイルをスタンドアロンでghci可能にすることができます。また、個々のファイルごとにすべての拡張子を有効にする必要がないため、各ファイルがどの拡張子を使用しているかを簡単に確認できます。使用している拡張機能とその普及方法によって異なります。 – shachaf

+1

@shachaf:もちろんです。いい視点ね。私も個人的には、それらを使用するすべてのソースファイルのすべての拡張子を綴ることを好みます。 – shang

+2

どちらも便利です。私は、推奨されるアプローチは、ファイルごとに 'LANGUAGE'プラグマを使用して必要な拡張子を書き出し、Cabalの' other-extensions'フィールドにパッケージに必要な拡張子を記録することであると思います。 'other-extensions'リストは、デフォルトでは有効になっていませんが、(パッケージのすべてのソースファイルを個別に見る必要はありません)パッケージの拡張要件を理解するのに役立つことがあります。 – kosmikus

関連する問題