用Mathematica进行咖喱处理
|
使用以下构造,可以在Mathematica中实现有限形式的Currying:
f[a_][b_][c_] := (a^2 + b^2)/c^2
允许这样做,例如:
f[4][3] /@ Range@5
{25,25/4,25/9,25/16,1}
有一个问题:“ 2”仅适用于第一个(一组)自变量。考虑:
ClearAll[f]
SetAttributes[f, HoldAllComplete]
f[a_][b_][c_] :=
{ToString@Unevaluated@a,
ToString@Unevaluated@b,
ToString@Unevaluated@c}
f[2 + 2][ 8/4 ][3 + 5]
{\“ 2 + 2 \”,\“ 2 \”,\“ 8 \”}
我的意图是返回列表中的\"8 / 4\"
和\"3 + 5\"
。
所以:
有没有办法将属性扩展到此构造?
是否有另一个方便的构造来实现这一目标?
除了属性以外,还有其他方法可以在Mathematica中扩展Currying吗?
没有找到相关结果
已邀请:
5 个回复
课刊灭似
它导致所需的携带:
→
它适用于三个可能的参数分区
并给出正确的结果:
,但for11ѭ失败。对于这个,可以使用一些高级版本:
祁澈盘哼颗
时,它实际上提供了Curry想要的结果。 (如果您熟悉lambda演算,则“ Function”是Mathematica的“ lambda”。)
我认为您希望能够执行以下操作:
→
如果您经常要执行这种操作,则可以使键入以下内容变得更加容易:
Mathematica Cookbook在第73-77页上提出了一种截然不同的Currying方法。 作为一般准则,如果您尝试控制Mathematica何时计算表达式,将使自己感到痛苦。在许多情况下,更好的方法是将符号用作您尚不想评估的表达式的占位符,然后当需要评估一个表达式时,可以将所需的表达式替换为符号。
梆晨灸碾
可以使用现在未记录的符号
对匹配的表达式进行模式匹配:
...尽管此功能无法解决当前问题。
已在多个版本中弃用,以至于最终将其从文档中删除。但是我不知道有什么其他方式可以匹配咖喱表达式。我推测它之所以被弃用,恰恰是因为它不能有效地附加属性和定义,使它处于可怕的状态:该符号尚未完全集成到Mathematica的长期系统中,并且可能会发生变化。
戒黑恳农
这利用了以下事实:在元素之前对头进行递归评估。从这里您可以看到,人们能够以这种方式提取未评估的参数,并且也许可以将其用于进一步处理。但是,计算被中断。还应该有可能从ѭ25中提取足够的信息以恢复计算。我不确定是否可以在Mathematica中实现延续,但是如果可以,那么可能应该遵循这些原则。
咳累录酬
为此,我们要使其隐式为“ curryable”,因此可以通过以下任何一种方式调用它:
如果有一种方法可以自动生成以下定义(我们将在下面进行操作),则可以实现此目的:
就像上面Matt的另一个答案一样,我们只能做一个定义:f:= Funcion [a,Function [b,Function [c,BODY]]],但是那样我们将不能通过f [ a,b,c]或f [a,b],并且只需将其称为f [a] [b]或f [a] [b] [c]。使用多个定义,我们可以选择任何一种样式。 可以通过函数CurryableSetDelayed(如下定义)来生成这些定义,只需调用:
即使定义了任何这些符号,这也将按预期工作,就像SetDelayed可以工作一样。 同样,使用Notation包,您可以使其显示为赋值运算符;说f [a_,b_,c]#= {c,b,a},但我没有尝试过。 在下面的源代码中,我使用了一些可能与会话冲突的特殊符号,因此,如果要使用此符号,请将其放在程序包名称空间中。 完整代码:
更新,现在属性(HoldAllComplete等)扩展到所有参数,因此只要您在调用CurryableSetDelayed之前设置属性,以下各项就可以正常工作: