我有很多方法在他们的定义中都有样板代码,请看上面的示例。在Haskell函数中匹配模式
replace:: Term -> Term -> Formula -> Formula
replace x y (Not f) = Not $ replace x y f
replace x y (And f g) = And (replace x y f) (replace x y g)
replace x y (Or f g) = Or (replace x y f) (replace x y g)
replace x y (Biimp f g) = Biimp (replace x y f) (replace x y g)
replace x y (Imp f g) = Imp (replace x y f) (replace x y g)
replace x y (Forall z f) = Forall z (replace x y f)
replace x y (Exists z f) = Exists z (replace x y f)
replace x y (Pred idx ts) = Pred idx (replace_ x y ts)
如您所见,replace
函数的定义遵循一种模式。我想有功能相同的行为,简化了他的定义,可能使用一些模式匹配,可能与通配符_
或X
在争论,是这样的:
replace x y (X f g) = X (replace x y f) (replace x y g)
为了避免以下定义:
replace x y (And f g) = And (replace x y f) (replace x y g)
replace x y (Or f g) = Or (replace x y f) (replace x y g)
replace x y (Biimp f g) = Biimp (replace x y f) (replace x y g)
replace x y (Imp f g) = Imp (replace x y f) (replace x y g)
有什么方法吗?忘记功能的目的,它可以是任何东西。
也许'DeriveFunctor'或做它一个明确的实例?那么上面的结果可能是'替换x y = fmap(\ z - >如果x == z然后y其他x)''。当然,这意味着'公式'将会有'* - > *',但这听起来很合理。 “Formula Bool”将是一个布尔公式。 – Alec
你可以使'Formula'成为['Compos']的一个实例(https://hackage.haskell.org/package/uniplate-1.6.12/docs/Data-Generics-Compos.html),这会有帮助吗? – Cactus