通过运算符关联性和优先级,我发现了以下内容:
infixr 0 $
infixl 1 &
infixl 4 <$>
infixl 1 <&>
Run Code Online (Sandbox Code Playgroud)
这看起来很奇怪.&并且<&>具有相同的优先级,但$并<$>不仅有广泛不同的优先级,而且在相关联的不同方向.
这有什么好的理由,还是只是一个历史性的疣?如果这是一个历史性的疣,你会怎样改变它?
我假设<&>你所说的是来自镜头包.在这种情况下,镜头运营商真正建立与其他运营商镜片相处,他们真的不担心这么多关于正规经营者,所以<&>并&可能是一个巧合.然而,另外两个更经过深思熟虑.
$根据定义,是最低优先级.这就是它存在的原因; 如此彻底地改变文本的顺序,它可以减少对括号的需求.因此,它自然地设置为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)
这表示将第一个列表中的所有数字应用于第二个列表中的数字,然后将结果添加到......某事.毋庸置疑,这不会发生变形.