编程泛函(或生成函数的函数)我有一个问题,我想要的解决方案是使用一个函数生成另一个函数。 这是一个玩具示例。 我预计它会返回[3,4,5]。它没有像我希望的那样工作,因为显然传递的参数(偏移量)不可用于返回的匿名函数。 我的猜测是有一种方法可以通过替换来做到这一点,但我无法弄清楚。
funWrapper = Function({array, fun},
fun(array);
);
funFunctional = Function({offset},
Function({x},
x + offset;
);
);
funWrapper([1,2,3], funFUnctional(2));高级统计建模实验设计质量和工艺工程回复:泛函编程(或生成函数的函数)抱歉在这里重复发布,但实际上有更好的方法来做到这一点,只需要修改功能:
funWrapper = Function({array, fun},
fun(array);
);
funFunctional = Function({offset},
Eval( Substitute(
Expr(
Function({x},
x + _offset_;
)
)
,
Expr( _offset_ ), offset
) )
);
funWrapper([1,2,3], funFUnctional(2));回复:泛函编程(或生成函数的函数)@SDF1 ,我试图找到函数为零的参数值,类似于单根R 中的函数 我不知道有类似的 JMP 功能。 无论如何,我偷了代码来做到这一点,所以这很容易:)
回复:泛函编程(或生成函数的函数)请注意,JMP14 类的功能并不完整,如果您过于依赖它们,您可能会被烧毁;然而,在 JMP12+ 中,您可以使用命名空间和一些元编程来创建类(包括继承、构造函数、析构函数等)。
为了回答OP的最初问题——您只需对脚本进行最少的编辑就可以实现您的目标——只需注意,JSL函数的返回值在返回之前会被评估(使用Eval()语句)。因此,如果您的最后一个语句是未计算的表达式(例如 Expr( Function( _definition_ ) ),那么它将按预期返回该函数。在第二个函数中只需要一个小技巧就可以调用该函数(“fun = fun”语句)。
funWrapper = Function({array, fun},
fun = fun;
fun(array);
);
funFunctional = Function({offset},
Substitute(
Expr(
Function({x},
x + _offset_;
)
)
,
Expr( _offset_ ), offset
)
);
funWrapper([1,2,3], funFUnctional(2));回复:泛函编程(或生成函数的函数)你好@米特曼,
听起来您正在尝试求解方程的根(在本例中是函数,而不是 JSL Function()),对吗?
有一个名为 Minimize() 的内置 JSL 函数,您可以将函数传递给该函数,并为 Minimize() 函数提供起点,以开始其优化例程。 这可能比为此编写自己的 JSL Function() 更容易。 您可以阅读有关它的博客文章这里。
希望有帮助!,
DS
回复:泛函编程(或生成函数的函数)你好@SDF1 , 谢谢回复。 然而,这不适用于我的实际用例。 我希望能够将任意(单调)函数作为参数传递给找到零的函数。 如果我显式定义每个函数,这很简单,但是当我想编写一个函数来从参数化类创建函数实例时,我遇到了麻烦。 我是在 R 中长大的,R 并不是真正的面向对象,但其范围规则允许像我在原始帖子中使用的代码。
- 电磁波
回复:泛函编程(或生成函数的函数)你好@米特曼,
不确定这是否正是您想要的,但它至少可以解决您在原始帖子中给出的示例。
Names Default to Here (1);
fWrap = Function({array, offset}, fFun(array offset));
fFun = Function({x, offset}, x + offset);
fWrap([3, 4, 5, 6], 5 );这将返回 [8, 9, 10, 11]。
这是一个有趣的问题。 如果您能分享为什么需要这样做,我很好奇。
希望这可以帮助!,
DS
回复:泛函编程(或生成函数的函数)感谢克雷格分享这些富有洞察力的小插曲。
以下是使用这两种方法的解决方案。 类对我来说更直观(并且“this”肯定比命名空间(expr(ns<
在 JMP 14 Pro 和 JMP 12 Pro 中进行了测试。 类在 JMP 12 Pro 中不可用。
funOffsetAdder = Function({offset},
ns = NewNamespace();
ns:offset = offset;
ns:theMethod = EvalExpr(
Function({x},
this = namespace(expr(ns<<GETNAME></GETNAME>回复:泛函编程(或生成函数的函数)我做了一些实验:如何使用定义类和使用 JSL 对象进行函数式编程
如果您弄清楚了更多谜题,请回帖;目前,我不太使用 JSL 类,但它们可能是实现您想要的功能的最佳方法。 命名空间可能是等效的,没有一些子类化的想法。 任何一个都可以让您将函数和数据打包在一起,并通过引用将包传递给另一个函数。