替换haskell中复合函数中的函数

时间:2017-04-18 14:40:51

标签: function haskell

我试图熟悉Haskell,我想知道以下是否可能,如果可能,怎么样?

假设我有一组函数{f,g,..},我将为其定义替换函数{f',g',..}。现在说我有一个函数c,它在自身内部使用这些函数(并且只有这些函数),例如c x = g (f x)。有没有办法在没有明确定义的情况下自动定义c' x = g' (f' x)

编辑:通过替换函数f',我的意思是某些在概念上与f相关的函数以某种任意方式被改变。例如,如果f xs ys = (*) <$> xs <*> ysf' (x:xs) (y:ys) = (x * y):(f' xs ys)

非常感谢, 本

2 个答案:

答案 0 :(得分:1)

如果您的示例似乎是ff'具有相同的类型等,那么您可以轻松地将它们作为额外参数传递。像

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代码根本无法以任何方式检查函数 - 这会违反参照透明度。