7
私はモナド変圧器を、既存のものの設計に基づいて自分の小さなライブラリを実装することによって理解しようとしています。MTLライブラリにはどのような言語拡張が必要ですか?
私が立ち往生しているのは、言語拡張です。 MonadErrorに記載されている唯一の拡張子はUndecidableInstances
です。しかし、同様のコードをFunctionalDependencies
とFlexibleInstances
も使用せずにコンパイルすることはできません。私は信じていることを
例FunDepsが必要です。
class (Monad m) => MonadError e m | m -> e where
と柔軟なインスタンス:
instance MonadError e m => MonadError e (MaybeT m) where
MonadError
コードの余分な2つの拡張を回避しない方法は?
注:この操作を行うことができますが、多くの人々がそれぞれのファイルで 'LANGUAGE'プラグマと拡張を綴ることを好みます。こうすることで、ファイルをスタンドアロンでghci可能にすることができます。また、個々のファイルごとにすべての拡張子を有効にする必要がないため、各ファイルがどの拡張子を使用しているかを簡単に確認できます。使用している拡張機能とその普及方法によって異なります。 – shachaf
@shachaf:もちろんです。いい視点ね。私も個人的には、それらを使用するすべてのソースファイルのすべての拡張子を綴ることを好みます。 – shang
どちらも便利です。私は、推奨されるアプローチは、ファイルごとに 'LANGUAGE'プラグマを使用して必要な拡張子を書き出し、Cabalの' other-extensions'フィールドにパッケージに必要な拡張子を記録することであると思います。 'other-extensions'リストは、デフォルトでは有効になっていませんが、(パッケージのすべてのソースファイルを個別に見る必要はありません)パッケージの拡張要件を理解するのに役立つことがあります。 – kosmikus