我试图熟悉Haskell,我想知道以下是否可能,如果可能,怎么样?
假设我有一组函数{f,g,..}
,我将为其定义替换函数{f',g',..}
。现在说我有一个函数c
,它在自身内部使用这些函数(并且只有这些函数),例如c x = g (f x)
。有没有办法在没有明确定义的情况下自动定义c' x = g' (f' x)
?
编辑:通过替换函数f'
,我的意思是某些在概念上与f
相关的函数以某种任意方式被改变。例如,如果f xs ys = (*) <$> xs <*> ys
则f' (x:xs) (y:ys) = (x * y):(f' xs ys)
等
非常感谢, 本
答案 0 :(得分:1)
如果您的示例似乎是f
和f'
具有相同的类型等,那么您可以轻松地将它们作为额外参数传递。像
cGen :: ([a] -> [a] -> [a]) -> (([a] -> [a]) -> b) -> [a] -> b
cGen f g x = g (f x)
... BTW也可以写成cGen = (.)
...
如果要将特定的“功能集”组合在一起,可以使用“配置类型”进行组合
data CConfig a b = CConfig {
f :: [a] -> [a] -> [a]
, g :: ([a] -> [a]) -> b
}
cGen :: CConfig a b -> [a] -> b
cGen (CConfig f g) = f . g
答案 1 :(得分:0)
执行此类操作的最简洁可靠的方法是使用RecordWildCards
data Replacer ... = R {f :: ..., g :: ...}
c R{..} x = g (f x)
现在,您的一组函数现在从记录中的本地范围中提取,而不是全局定义,并且可以自行更换为一组不同的函数。
接近你想要的唯一方法是使用Template Haskell来解析源代码并对其进行修改。常规的Haskell代码根本无法以任何方式检查函数 - 这会违反参照透明度。