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.
Ich vermute, dass Sie in der Lage sein werden, dies relativ leicht für dags zu tun, aber andere Strukturen werden schlecht sein. – dfeuer
@dfeuer ich glaube immer weniger, dass dies einfach ist. Aber ich würde gerne falsch bewiesen werden! :) – jtobin
Ich denke, die Frage stehen könnte etwas klarer sein. – dfeuer