【发布时间】:2020-08-15 03:16:55
【问题描述】:
在 Ullman 的 SML 书中
大多数 不寻常的是 :: (list cons) 和 @ (list concatenation) 运算符是右关联的,这意味着它们分组 像我们见过的大多数运算符一样,从右侧而不是左侧。
我明白cons为什么是右结合的原因:第二个操作数必须是一个列表,返回的是一个列表。
鉴于 SML 中“我们见过的大多数运算符”都是左关联的,为什么 SML 中的列表连接是右关联的?
谢谢。
【问题讨论】:
在 Ullman 的 SML 书中
大多数 不寻常的是 :: (list cons) 和 @ (list concatenation) 运算符是右关联的,这意味着它们分组 像我们见过的大多数运算符一样,从右侧而不是左侧。
我明白cons为什么是右结合的原因:第二个操作数必须是一个列表,返回的是一个列表。
鉴于 SML 中“我们见过的大多数运算符”都是左关联的,为什么 SML 中的列表连接是右关联的?
谢谢。
【问题讨论】:
连接的成本与左操作数的长度成线性关系,因为它必须被复制。因此,x @ (y @ z) 比 (x @ y) @ z 便宜,因为后者会复制列表 x 两次。
此外,有时您可能希望混合使用 cons 和 concat 运算符 (x @ y :: z),如果它们具有不同的优先级或关联性,这将更加笨拙。
【讨论】: