2015-09-18 6 views
7

Nehmen Sie diese einfache Basis Funktors und andere Maschinen für eine kostenlose Monade mit verbindlichen Konditionen:die Bindungsstruktur in einem freien Monade Prüfungs 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) 

Und hier ist ein einfaches Programm

prog :: Program Int 
prog = do 
    a <- foo 
    bar a 

Es hat die Beobachtet (Hand-crafted) AST:

prog = 
    Free (FooF (\p0 -> 
    Free (BarF p0 (\p1 -> 
     Pure p1)) 

Was würde ich zu tun, um die Lage sein mag, ist Grund zu gebundenen Bedingungen der fol gende Weise:

  • Blick auf den Pure Begriff in dem AST
  • Note die gebundenen Variablen, die auftreten, da
  • annotate den entsprechenden Bindungs ​​Knoten im AST

einen kostenlosen Monade AST mit Anmerkungen versehen direkt über eine cofree comonad scheint unmöglich zu sein, ohne some kind of pairing tun, aber Sie könnten sich vorstellen, zu etwas wie die folgenden annotierten AST (über, sagen, Fix), in denen Knoten, die Variablen, die inerscheinen

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

Also:mit Just True kommentierten ist es eine Möglichkeit, die Bindungen in einem Programm wie dies in solchen Ad-hoc-Weise zu untersuchen? Das heißt, ohne einen deutlichen Variablentyp à la this question, beispielsweise eingeführt werden.

Ich vermute, dass dies unmöglich sein könnte. Optionen wie data-reify sind attraktiv, aber es scheint extrem schwierig oder unmöglich zu sein, ProgF eine Instanz der erforderlichen Typklassen (Foldable, Traversable, MuRef) zu machen.

Ist diese Intuition korrekt, oder gibt es ein Mittel, das ich nicht berücksichtigt habe? Beachten Sie, dass ich bin gerne gruesomely unsicher oder dynamische Mittel zu unterhalten.

+0

Ich vermute, dass Sie in der Lage sein werden, dies relativ leicht für dags zu tun, aber andere Strukturen werden schlecht sein. – dfeuer

+0

@dfeuer ich glaube immer weniger, dass dies einfach ist. Aber ich würde gerne falsch bewiesen werden! :) – jtobin

+0

Ich denke, die Frage stehen könnte etwas klarer sein. – dfeuer

Antwort

1

Ich bin zufrieden, dass dies nicht durch irgendeine "vernünftige" Ad-hoc-Methode möglich ist, aus dem gleichen Grund, dass es nicht möglich ist, die Bindungsstruktur von z. \a -> \b -> \c -> b + a.