gpt4 book ai didi

wolfram-mathematica - 用Mathematica curry

转载 作者:行者123 更新时间:2023-12-03 08:47:31 26 4
gpt4 key购买 nike

可以使用以下构造在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}

There is a problem: Attributes only apply to the first (set of) argument(s). Consider:

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吗?
  • 最佳答案

    抱歉,可能没有相关评论。我刚刚搜索了“使用Mathematica进行搜索”,这个问题是Google列表中的第一个。虽然已经1岁了,但是已经得到了答案,但我发现提出的解决方案并不是很优雅。初始代码的简单修改如下:

    ClearAll[f]
    SetAttributes[f, HoldAllComplete]
    f[a_, b_, c_] := {ToString@Unevaluated@a, ToString@Unevaluated@b,
    ToString@Unevaluated@c}
    f[a__] := Function[x, f[a, x], HoldAll]

    它导致所需的携带:
    f[2+2][2+1] /@ Unevaluated@{1+1, 3+3}{{2+2, 2+1, 1+1}, {2+2, 2+1, 3+3}}
    它适用于三个可能的参数分区
    f[1 + 1, 2 + 2, 6 + 1]
    f[1 + 1, 2 + 2][6 + 1]
    f[1 + 1][2 + 2][6 + 1]

    并给出正确的结果: {"1+1", "2+2", "6+1"}},但 f[1 + 1][2 + 2, 6 + 1]失败。对于这个,可以使用更高级的版本:
    ClearAll[f, g]
    SetAttributes[f, HoldAllComplete]
    SetAttributes[g, HoldAllComplete]
    f[a_, b_, c_] := (ClearAll[g]; SetAttributes[g, HoldAllComplete];
    Thread[Hold[{a, b, c}]] /. {Hold[e_] :> ToString@Unevaluated[e]})
    f[a__] := (g[x__] := f[a, x]; g)

    关于wolfram-mathematica - 用Mathematica curry ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5686494/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com