結合条件に無料モナドのためのこの単純な基本ファンクタやその他の機械を取る:無料モナドASTに結合構造を調べる
{-# LANGUAGE DeriveFunctor #-}
import Control.Monad.Free
data ProgF r =
FooF (Double -> r)
| BarF Double (Int -> r)
| EndF
deriving Functor
type Program = Free ProgF
foo = liftF (FooF id)
bar a = liftF (BarF a id)
そして、ここでは簡単なプログラム
prog :: Program Int
prog = do
a <- foo
bar a
だそれは持っています次の(手作りの)AST:
prog =
Free (FooF (\p0 ->
Free (BarF p0 (\p1 ->
Pure p1))
私ができることを望むのは、fol lowing方法:ASTでPure
用語
- 表情が
- 注釈を直接自由モナドASTの注釈AST
で対応する結合ノードsome kind of pairingを実行しなくても、無条件のコモノードを使用することは不可能だと思われますが、という注釈付きのAST(Fix
)のようなものになると想像すると、Pure
はJust True
でアノテートされています
annotatedProg =
Just False :< FooF (\p0 ->
Just True :< BarF p0 (\p1 ->
Nothing :< EndF))
ので:そのようなアドホックな方法でこのようなプログラムでバインディングを検査する方法はありますか?例えば、this questionという別個の変数型を導入することなく、
私はこれが不可能かもしれないと思う。 data-reify
のようなオプションは魅力的ですが、必要なタイプメス(Foldable
,Traversable
、MuRef
)のインスタンスをProgF
にすることは非常に困難または不可能なようです。
この直感は正しいのですか、これを行う手段がありますか?私は不気味に危険なやり方を楽しんでいることに注意してください。
私はあなたがダグのためにこれをかなり簡単に行うことができると思うが、他の構造は悪くなるだろう。 – dfeuer
@dfeuerこれは簡単ではないと信じています。しかし、私は間違っていることを証明したい! :) – jtobin
私は質問が少し明確になることができると思う。 – dfeuer