【发布时间】:2022-01-22 03:22:34
【问题描述】:
我正在使用自定义运算符 infix、infixl 和 infixr。现在我很困惑。
我为列表乘法编写了一个自定义运算符,并认为将其声明为没有方向关联性的简单中缀运算符会自动提供nr * list 和list * number 这两种情况,因为它们可以是随意互换。
import Prelude hiding ((*))
infix 6 *
(*) :: Int -> [a] -> [a]
n * l = if n < 0 then []
else l ++ (n - 1) * l
现在,3 * [1, 2, 3] 按预期返回[1, 2, 3, 1, 2, 3, 1, 2, 3],但[1, 2, 3] * 3 抛出错误,因为我从未明确定义过list * nr。
我的问题:infix 的独特功能是什么?为什么不总是使用infixl 或infixr,因为它应该没有区别?
我将“无方向关联性”/infix 理解为“可交换”的同义词:
a + b + c没有方向关联性,是可交换的,可以写成(a + b) + c、a + (b + c)、b + a + c、(b + a) + c等等……
对于我的示例 2 * [1, 2] * 1 与 1 * (2 * [1, 2]) 以及所有其他组合相同,所以我真的不明白为什么交换运算符声明没有隐式重塑,即使使用不同类型的操作数也是如此。
【问题讨论】:
-
您误解了“关联性”一词。它的意思不是单个运算符的参数顺序,而是连续计算多个运算符的顺序,例如
a * b * c -
'我将“无关联性”理解为“可交换”的同义词:'这是不正确的。 “非关联”表示
(a * b) * c != a * (b * c)。可交换表示a * b == b * a。 -
@chepner xnor (aka
(==) @Bool) 是可交换的,但不是关联的。 -
@xtay2 再次查找它们,并仔细阅读它们。您的“类似”短语应该是一种直觉,但英语并不精确,只有数学才是真正重要的。你会发现 chepner 是对的:交换律和结合律不是一回事。
-
@chepner 哎呀,你完全正确!我的大脑短路了。 nand 和 nor 可交换但不可结合,xnor 既可交换又可结合。
标签: haskell operators infix-operator