2014-02-15 29 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_'。 –

回答