奇怪的优先级和相关性

Cli*_*ton 2 haskell

通过运算符关联性和优先级,我发现了以下内容:

infixr 0 $
infixl 1 &
infixl 4 <$>
infixl 1 <&>
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪.&并且<&>具有相同的优先级,但$<$>不仅有广泛不同的优先级,而且在相关联的不同方向.

这有什么好的理由,还是只是一个历史性的疣?如果这是一个历史性的疣,你会怎样改变它?

Sil*_*olo 7

我假设<&>你所说的是来自镜头包.在这种情况下,镜头运营商真正建立与其他运营商镜片相处,他们真的不担心这么多关于正规经营者,所以<&>&可能是一个巧合.然而,另外两个更经过深思熟虑.

$根据定义,是最低优先级.这就是它存在的原因; 如此彻底地改变文本的顺序,它可以减少对括号的需求.因此,它自然地设置为0.同时,<$>是一个在上下文中的应用程序,您实际需要做的事情,而$不仅仅是语法帮助.因此<$>,与其他类似运算符相处的优先级更高,例如,Alternative类运算符的<|>优先级较低,因此可以<$>适当地链接这些调用.

至于关联性,这仅仅是运算符的使用方式.$通常用于更简单的功能组合.也许有人会写f $ g $ x的意思f (g x).然而<$>,几乎总是被束缚<*>,这也是infixl 4.这样,以下语句是有效的.

(+) <$> [1, 2, 3] <*> [10, 20, 30]
Run Code Online (Sandbox Code Playgroud)

由于左关联性,该表达式将解析为以下内容.

((+) <$> [1, 2, 3]) <*> [10, 20, 30]
Run Code Online (Sandbox Code Playgroud)

这正是我们想要的.函数(+)是curry并接受两个应该逐个传递的参数.如果具有正确的关联性,则会发生以下情况.

(+) <$> ([1, 2, 3] <*> [10, 20, 30])
Run Code Online (Sandbox Code Playgroud)

这表示将第一个列表中的所有数字应用于第二个列表中的数字,然后将结果添加到......某事.毋庸置疑,这不会发生变形.