最大值(curried函数)

时间:2017-10-29 20:30:28

标签: maxima

我尝试在maxima中编写curried函数,但似乎无法在lambda函数中获取参数,这是我的代码:

structp(type) := lambda([struct], is(reveal(struct, 1) = type));

我想让它像这样工作,说我有:

defstruct(a(b,c));
struct: a(1,2);
structp(a)(struct);

最后一个应该返回true,因为struct的类型为a

在某种程度上可以在lambda函数中获取参数吗?

我喜欢在这里使用curried函数,因为这样我可以编写这样的短代码:

sublist(list_of_structs, structp(a));

1 个答案:

答案 0 :(得分:2)

在将lambda应用于参数之前,不会评估lambda内的表达式。例如。如果您有f(y) := lambda([x], y*x),那么f(5)会返回lambda([x], y*x)(而不是lambda([x], 5*x)。)

至少有几种方法可以获得您想要的效果。我想也许最简单的是f(y) := subst('y = y, lambda([x], y*x))。或者在你给出的例子中:

structp(type) := 
  subst ('type = type, lambda([struct], is(reveal(struct, 1) = type)));

然后structp(a)根据需要返回lambda([struct], is(reveal(struct, 1) = a))

编辑:还有其他方法可以达到同样的效果。看看buildq