我找到了一个解决方法来制作复合函数,但我相信应该有更好的方法来做到这一点:
? f = x^2
%1 = x^2
? g = x^3
%2 = x^3
? x = g
%3 = x^3
? fog = eval(f)
%4 = x^6
? x = 2
%5 = 2
? result = eval(fog)
%6 = 64
在这个方法中,我需要多次分配x
,我不想使用eval
函数。
-
您可以将Piotr的漂亮答案简化为
comp(f, g) = x->f(g(x));
实际上,您不需要在comp
函数本身中为(全局)变量h
赋值。此外,对于单行语句来说,大括号是不必要的,类型注释也是不必要的(它旨在优化字节编译器输出或帮助gp2c
;在这种特殊情况下,它们没有帮助)。最后,在闭包定义中,当只有一个参数时,参数列表周围的圆括号是可选的,如(x)
。
-
我会将示例修改如下
f(x) = x^2; g(x) = x^3; h = comp(f, g); ? h('x) \ note the backquote %1 = x^6 ? h(2) %2 = 64
'x
中的反引号确保我们使用形式变量x
,而不是赋给具有该名称的GP变量的任何值。对于第二个示例,不需要将值2
赋值给x
,我们可以直接调用h(2)
注:形式变量和GP变量之间的混淆令人遗憾,但对于x
或y
这样的短名称来说非常常见。引入引号操作符是为了避免必须使用kill
变量。在更复杂的函数中,系统地键入'x
而不是x
可能会很麻烦。避免这种情况的惯用结构是my(x = 'x)
。这确保了x
GP变量确实引用了当前作用域中的形式变量。
PARI/GP支持匿名闭包。所以你可以自己定义函数组合,像这样:
comp(f: t_FUNC, g: t_FUNC) = {
h = (x) -> f(g(x))
};
然后你的代码可以转换成更容易读的形式:
f(x) = x^2;
g(x) = x^3;
h = comp(f, g);
h(x)
? x^6
x = 2; h(x)
? 64
希望,这有帮助。