2015-09-18 8 views
7

結合条件に無料モナドのためのこの単純な基本ファンクタやその他の機械を取る:無料モナド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)のようなものになると想像すると、PureJust Trueでアノテートされています

    annotatedProg = 
        Just False :< FooF (\p0 -> 
        Just True :< BarF p0 (\p1 -> 
         Nothing :< EndF)) 
    

    ので:そのようなアドホックな方法でこのようなプログラムでバインディングを検査する方法はありますか?例えば、this questionという別個の変数型を導入することなく、

    私はこれが不可能かもしれないと思う。 data-reifyのようなオプションは魅力的ですが、必要なタイプメス(Foldable,TraversableMuRef)のインスタンスをProgFにすることは非常に困難または不可能なようです。

    この直感は正しいのですか、これを行う手段がありますか?私は不気味に危険なやり方を楽しんでいることに注意してください。

  • +0

    私はあなたがダグのためにこれをかなり簡単に行うことができると思うが、他の構造は悪くなるだろう。 – dfeuer

    +0

    @dfeuerこれは簡単ではないと信じています。しかし、私は間違っていることを証明したい! :) – jtobin

    +0

    私は質問が少し明確になることができると思う。 – dfeuer

    答えて

    1

    私は、これがどのような「純粋な」アドホックな方法でも可能ではないことに満足しています。 \a -> \b -> \c -> b + a

    関連する問題