是一个属性,它可以赋给一个符号 f ,指定涉及嵌套函数 f 的所有表达式应当被压平. 这个属性包括在模式匹配中.
Flat
是一个属性,它可以赋给一个符号 f ,指定涉及嵌套函数 f 的所有表达式应当被压平. 这个属性包括在模式匹配中.
范例
打开所有单元 关闭所有单元基本范例 (3)
范围 (3)
Attributes[NonCommutativeMultiply](a**(b**c))**(d)在模式匹配中,Flat 允许元素序列被替换:
SetAttributes[f, Flat]f[a, b, c, d, e] /. f[b, c, d] -> xf[a, b, c, d, e] /. f[b, c, d] -> f[x, y]f[a, b, c, d, e] /. f[b] -> xSetAttributes[f, {Flat, Orderless}]f[a, b, c, d, e] /. f[d, b] -> x属性和关系 (5)
f[f[a, b], f[c, f[d, e]]]Flatten[%]SetAttributes[g, Flat]g[g[a, b], g[c, g[d, e]]]SetAttributes[g, {Flat, OneIdentity}]g[x_, y_] := x + yg[a, b, c, d]当任意序列匹配出现时,一个带有 flat head 的表达式即被视为匹配:
a + b + Sin[a + b] /. a + b -> 5{a + b, Sin[a + b]} /. a + b -> 5ReplaceRepeated 可能会帮助确保所有的情形都被替换:
a + b + Sin[a + b] //. a + b -> 5Blank 与 Flat 函数 f 中的序列匹配时,会保留 head f:
SetAttributes[f, Flat]f[a, b, c] /. f[a, x_] -> {x}f[a, b, c] /. f[x_] -> {x}序列模式,如 BlankSequence 和 BlankNullSequence 不受 Flat 的影响:
f[a, b, c] /. f[a, z__] :> {z}f[a, b, c] /. f[a, z___] :> {z}对于没有 OneIdentity 的压平函数 f,当 f[x_] 与 f[expr] 相比较时,模式匹配器会尝试先绑定 x_ 和 f[expr](仅在与 expr 的匹配失败以后):
SetAttributes[f, Flat]f[3] /. f[z_] /; IntegerQ[Echo[z]] :> z如果函数拥有属性 OneIdentity,则跳过第一次的尝试:
SetAttributes[fo, {Flat, OneIdentity}]fo[3] /. fo[z_] /; IntegerQ[Echo[z]] :> z可能存在的问题 (4)
对于 flat 和无序的函数,模式匹配可能需要尝试很多情况:
SetAttributes[f, {Flat, OneIdentity, Orderless}]ReplaceList[f[a, b, c, d], f[x_, y_] :> {x, y}]Longest 可用来阻止与较短的子表达式进行匹配:
SetAttributes[f, {Flat, OneIdentity}]Replace[f[a, b, c, d], f[x_, y__, z_] :> {y}]Replace[f[a, b, c, d], f[x_, Longest[y__], z_] :> {y}]对于展平函数 f,模式 f[_] 匹配有一个或多个参数的 f:
SetAttributes[f, Flat]MatchQ[f[1, 2], f[_]]Repeated 可被用作只匹配单个参数的模式,包括在展平函数里面的情况:
MatchQ[f[1, 2], f[Repeated[_, {1}]]]限制条件可能和预想的效果不同,因为 x_ 还会与 flat 函数的标头进行匹配:
Replace[a + b + c , Plus[a, x_] :> x]而这个限制条件起作用了,因为 x_Plus 与 Plus[b,c] 相匹配:
Replace[a + b + c , Plus[a, x_Plus] :> x]下面的情形会失败,因为 x_ 不能同时拥有标头 Plus 和 Symbol:
Replace[a + b + c , Plus[a, x_Symbol] :> x]在左手侧使用 BlankSequence 会产生更一致的结果:
Replace[a + b + c, Plus[a, x__Symbol] :> Plus[x]]技术笔记
-
▪
- 有交换性和结合性的函数 ▪
- 属性 ▪
- 模式和变换规则
历史
1988年引入 (1.0)
文本
Wolfram Research (1988),Flat,Wolfram 语言函数,https://reference.wolfram.com/language/ref/Flat.html.
CMS
Wolfram 语言. 1988. "Flat." Wolfram 语言与系统参考资料中心. Wolfram Research. https://reference.wolfram.com/language/ref/Flat.html.
APA
Wolfram 语言. (1988). Flat. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/Flat.html 年
BibTeX
@misc{reference.wolfram_2026_flat, author="Wolfram Research", title="{Flat}", year="1988", howpublished="\url{https://reference.wolfram.com/language/ref/Flat.html}", note=[Accessed: 04-November-2026]}
BibLaTeX
@online{reference.wolfram_2026_flat, organization={Wolfram Research}, title={Flat}, year={1988}, url={https://reference.wolfram.com/language/ref/Flat.html}, note=[Accessed: 04-November-2026]}