我有一个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
...但它不能以我现在需要的方式利用上下文。 (因此它可以打印公式中某处发生的每一项,但不能打印整个公式的粗体字。)
感觉应该有这样做的光滑方式......任何建议将受到欢迎。
为了记录,'Type'不是一个保留字,所以你可以使用'data Type = TPoint | ...'而不是使用'Type_'。 –