2014-02-15 35 views
2

我有一個ADT爲,基本上,第一階邏輯材料:Haskell的:迭代通過在(複雜峯,遞歸)ADT _with context_

data Function = Function String            
data Predicate = Predicate String           

data Type_ = TPoint | TSet | TFunction | TPositiveRealNumber | TSequence | TNaturalNumber | TGroup 

data VariableType = VTNormal | VTDiamond | VTBullet       

data Dependencies = Dependencies [Term] {-dep-} [Term] {-indep-}    

data Variable = Variable String Int Type_ VariableType Dependencies   

data Term = VariableTerm Variable 
      | ApplyFn Function [Term]           

data Formula = AtomicFormula Predicate [Term] 
      | Not Formula 
      | And [Formula] 
      | Or [Formula] 
      | Forall [Variable] Formula 
      | UniversalImplies [Variable] [Formula] Formula 
      | Exists [Variable] Formula  

我需要通過每個Term(潛在深)來迭代嵌套內的給定Formula並做一些事情來了 - 說的事情將取決於項和「語境」在它出現兩者。所以作爲一個簡單的例子,我們可以反覆打印出公式,每個副本都有不同的粗體字。我不希望這種特殊的行爲連線;我想用以下類型簽名

f :: (FormulaWithTermShapedHole -> Term -> a) -> Formula -> [a] 

我已經有這種類型的簽名,可以做一些事情,以每學期功能的高階函數...

mapTermInFormulaM :: Monad m => (Term -> m Term) -> Formula -> m Formula 

...但它不能以我現在需要的方式利用上下文。 (因此它可以打印公式中某處發生的每一項,但不能打印整個公式的粗體字。)

感覺應該有這樣做的光滑方式......任何建議將受到歡迎。

+0

爲了記錄,'Type'不是一個保留字,所以你可以使用'data Type = TPoint | ...'而不是使用'Type_'。 –

回答