gpt4 book ai didi

haskell - Haskell 函数中的模式匹配

转载 作者:行者123 更新时间:2023-12-02 06:15:12 25 4
gpt4 key购买 nike

我有许多在其定义中包含样板代码的方法,请看上面的示例。

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)

有什么办法吗?忘记函数的目的,它可以是任何东西。

最佳答案

如果您有许多应该以统一方式处理的构造函数,则应该使您的数据类型反射(reflect)这一点。

data BinOp      = BinAnd | BinOr | BinBiimp | BinImp
data Quantifier = QForall | QExists
data Formula = Not Formula
| Binary BinOp Formula Formula -- key change here
| Quantified Quantifier Formula
| Pred Index [Formula]

现在所有二元运算符的模式匹配要容易得多:
replace x y (Binary op f g) = Binary op (replace x y f) (replace x y g)

要保留现有代码,您可以打开 PatternSynonyms并定义 And 的旧版本, Or ,等等重新存在:
pattern And x y = Binary BinAnd x y
pattern Forall f = Quantified QForall f

关于haskell - Haskell 函数中的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36807160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com