Haskell中能否定义函数定义类以消除重复的函数定义模式?
完全可以通过高阶函数抽象公共的函数定义模式,彻底消除你提到的重复模板代码。
你示例中所有h类函数的公共逻辑是:接收一个二元组参数,当第二个参数为0时调用处理边界场景的单参数函数,其他场景调用处理通用逻辑的二元参数函数。你可以把这部分公共逻辑抽成一个高阶工厂函数:
-- 公共模式抽象:接收边界处理函数f、通用处理函数g,返回符合模式的目标函数 makeH :: (Integer -> Integer) -> ((Integer, Integer) -> Integer) -> (Integer, Integer) -> Integer makeH f _ (x, 0) = f x makeH _ g (x, n) = g (x, n)
之后生成h1/h2/h3只需要传入对应的f和g即可,不需要再重复写类型声明和模式匹配逻辑:
h1 = makeH f1 g1 h2 = makeH f2 g2 h3 = makeH f3 g3
如果需要更高的复用性,还可以把工厂函数的类型泛化,不限制死参数和返回值为Integer,适配更多业务场景:
-- 泛化版本:支持任意类型的第一个参数和返回值 makeH :: (a -> b) -> ((a, Integer) -> b) -> (a, Integer) -> b makeH f _ (x, 0) = f x makeH _ g (x, n) = g (x, n)
内容的提问来源于stack exchange,提问作者Hugolin Bergier
相关产品推荐
相关产品推荐

