- 积分
- 12
- 注册时间
- 2009-2-23
- 仿真币
-
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2011-4-18 20:56:52
|
显示全部楼层
来自 LAN
本帖最后由 guocong89 于 2011-4-18 21:16 编辑
TBE 前几天的帖子引发了这个问题的讨论和思考。是的,f[x][y] 表示了什么含义?
也许和大多数人一样,我想当然的认为,这定义了一个函数,匹配形如 f[_][_] 的函数定义,它是f的一个DownValue。矛盾由此引发。
没错,它匹配 f[_][_] 的定义,但是它不是f的DownValue。
更为重要的一点是,一个Expression的Head不必要是个Symbol,它可以是任意Expression。也就是说,x+y可以是个函数名,f[x]也可以是个函数名。因此,对于f[x][x][x][x][x]来说,它仅仅是f[x][x][x][x]的一个简单函数而已。这种现象其实并不罕见,
但是,问题要是像以上描述的这么简单就好了,但是奇怪的行为还是层出不穷。
- Clear["`*"]
- f[x_][y_] := a
- f[x_] := b
- b[y_] := c
- f[x][y]
- Information[f]
- MatchQ[f[x][y], f[x_][y_]]
- MatchQ[f[x][y], b[y_]]
复制代码
结果
- c
- Global`f
- f[x_][y_]:=a
- f[x_]:=b
- True
- True
复制代码
请问这个该怎么解释呢?
我只能从优先级角度说,模式替换优先级高于模式匹配,因此f[x]先被替换成b
更进一步
- Clear["`*"]
- f[x_] := b
- f[x_][y_] := a
- Attributes[SetDelayed]
- Information[b]
- Hold[f[x][y]]
- f[x][y]
复制代码
结果
- {HoldAll, Protected, SequenceHold}
- Global`b
- b[y_]:=a
- Hold[f[x][y]]
- a
复制代码
既然SetDelayed具有HoldAll属性,Hold确实可以控制住f[x][y],那么为什么f[x_][y_] := a的定义还是转给了b呢? |
|