私は、「最終的なタグなし」スタイルを使用してPureScriptに埋め込み型DSLを実装しようとしています。レポはhttps://github.com/afcondon/purescript-finally-tagless-exPureScriptで「最終的にタグなし」typeclassのMonadicインスタンスを実装する方法は?
にあります。問題があります。非常に単純化されたファイルシステムの抽象定義を考える:
class (Monad m) <= MonadFileSystem m where
cd :: FilePath -> m Unit
ls :: m (Array (Tuple FilePath FileType))
cat :: Array FilePath -> m String
一つ簡単に文字列として評価するための組み込み言語として使用され、解釈(または実行する)ことができるように、この1(https://github.com/afcondon/purescript-finally-tagless-ex/blob/master/MonadicEx/src/FakeFileSystem.purs)として実装を提供することができます(あるいは、文字列に変換するのではなく、静的解析を行うこともできます)。
原則として、実際にはファイルシステムとやりとりするが、同じ埋め込み言語を正確に「解釈」できる副作用の例を持つこともできます。私はを受け入れることを意味するpurescript-node-fs
を使用したいと思います。
私の質問です。実際に "本当の"効果のあるインスタンスを実際に実装するにはどうすればよいですか? cd
、ls
、cat
の署名を変更する必要がありますか?またはEff
のモナド全体を何らかの形で評価して、それらの関数がEff
を署名に入れる必要がないようにすることはできますか?
本当に詳細な回答がありがとうございます。前者は副作用のみの状況ではうまく動作しますが、多くの状況で必要となる現在の作業ディレクトリのようなコンテキストを持つような方法で作成するのは難しいです。私は、FakeFSインスタンスのZipperの例に似た何かのハッキングを試みましたが、それはすべての素晴らしいnewtypeの派生を破ります。 2番目の解決策は本当に素敵で表現力がありますが、AbstractFileSystemと同じ場所に配置されていない限り、孤立したインスタンスエラーが発生するようです(偽ですか? –
孤児のエラーを避けるために 'MonadFileSystem'と一緒に後者を定義する必要があるのは事実です(別の孤立していない場所は' Eff'を持つモジュールにあります。あなたのフォローアップの質問では、とにかくcwdなどを維持するために 'Eff'の周りに' StateT'が必要なように聞こえるでしょう。この場合、おそらく孤児の問題を避ける 'newtype'ルートに行くでしょうあまりにも。 –