2017-04-18 40 views
0

我想要熟悉Haskell,我在想如果下面是可能的,如果是这样,怎么样?在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)

非常感谢, 本

+1

你是什么意思的“替代功能”?你能举一个更具体的例子吗?但是,我会猜测答案可能是“不是没有一些重构”。如果你能以某种方式让'f','g'和co在一个类型类型下生活,那么你可以重写所有'c'函数来使用该类型类型。或者,您可以通过创建一个数据类型进行显式传递,该数据类型包含您要使用的每个函数的字段。可能还有一个模板haskell解决方案,但我很少建议TH,除非没有其他方法。 – bheklilr

+0

你能详细解释一下类型类方法吗?我认为我会有一个带有函数的类型类型,并以我想要的方式生成另一个函数,但是如何使用它来生成'c''? – BenJacob

+0

也许从'自动分化'的想法可以帮助你。 – freestyle

回答

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 
0

最简洁和可靠的方法,这样做将与RecordWildCards

data Replacer ... = R {f :: ..., g :: ...} 

c R{..} x = g (f x) 

现在,您的函数集现在从本地范围从记录中拉出,而不是全局定义,并且可以根据您的判断将其替换为一组不同的函数。

接近你想要的东西的唯一方法是使用模板哈斯克尔解析源代码并对其进行修改。普通的Haskell代码根本无法以任何方式检查函数 - 这会违反引用透明性。