我有一個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_'。 –