ReplaceAll有什么有别于F的属性吗?
mathematica吧
全部回复
仅看楼主
level 9
x = 1;
y = 1;
F[x_, y_] := x + y
F[3, 3] // Trace
他的输出是6。
但是F没有HoldAll Attribute,为什么在F代入3,3之前x+y并未被计算为6呢?(SetDelayed有holdall我清楚,那F没有啊)
ReplaceAll没有HoldAll属性,所以他在模式匹配之前计算了待匹配的式子。
如果我们理解函数为一个模式匹配的话,那么应当是在代入之前函数自己偷偷算一遍才对,可为什么输出不是2而是6呢?
2023年12月18日 13点12分 1
吧务
level 10
「应当是在代入之前函数自己偷偷算一遍才对」
为什么
2023年12月22日 02点12分 3
F[1,2]我习惯性地认为是一个类似于先ReplaceAll或Cases再计算的过程。但是R和C两个函数都是先计算再替换的,F不是。很奇怪。有人说是SetDelayed的问题。但是F没有SetDelayed attribute啊?给f赋值的时候的SetDelayed也与F的1,2代入时无关
2023年12月22日 10点12分
@翌日翌日翌 你在哪里提到了R和C,是不是你帖子被吞了?另外我没有看懂你最后一句话的意思。
2023年12月23日 07点12分
@asdasd1dsadsa 目测是给ReplaceAll和Cases安了俩简称。(我也是头一次见到有人这么干。)
2024年01月06日 10点01分
吧务
level 10
楼上提到的「replaceall是先赋全局值计算再赋局部值计算」是错误的,是否先求值再替换,取决于你是否使用延迟规则。
2023年12月23日 07点12分 5
吧务
level 10
我不清楚你有怎样的误解,不过你可以用DownValues来看看各种情况下系统中所存储的是怎样的定义规则。
2023年12月23日 07点12分 7
吧务
level 15
为避免引发误解,这帖下面错误的回复我全砍了,还请理解。(删帖理由是随便填的。)
2024年01月06日 04点01分 14
吧务
level 15
楼主对函数的工作机制有重大误解。请注意,基于模式匹配的函数定义其实质也是一种模式匹配,它的行为是可以用其他模式匹配函数模拟的,换句话说,如果你不能依照你的解释,把函数定义替换成等效的其他模式匹配函数,那你的解释就有问题。我在 为什么b=a; f[a_]:=b; f[2]不输出2?——... 举了相应的例子,请仔细阅读。
2024年01月06日 04点01分 15
这里的“等效”指的是行为上的等效。Mathematica的函数定义存在专门的优化,具体仍请参看上面的精华帖。
2024年01月06日 04点01分
吧务
level 15
还有,解释问题时不要乱用自己也搞不清楚的概念。你是觉得世界上只有OwnValues还是怎么的?
2024年01月06日 04点01分 16
1