通过运算符关联性和优先级,我发现了以下内容:
infixr 0 $
infixl 1 &
infixl 4 <$>
infixl 1 <&>
这看起来很奇怪。 &
和<&>
具有相同的优先级,但$
和<$>
不仅具有广泛不同的优先级,而且还可以在不同的方向关联。
这有什么好的理由,还是这只是一个历史性的疣?如果它是一个历史性的疣,你会怎么改变呢?
答案 0 :(得分:7)
我假设您正在谈论的<&>
来自镜头包装。在这种情况下,镜头操作员确实设置为与其他镜头操作员相处,并且他们并不是非常担心常规操作员,所以<&>
和&
可能是巧合。然而,另外两个更经过深思熟虑。
$
是最低优先级。这就是它存在的原因;如此彻底地改变文本的顺序,它可以减少对括号的需求。因此,它自然地设置为0.同时,<$>
是一个上下文中的应用程序,实际上你需要做的事情,而不是$
这只是语法帮助。所以<$>
与其他类似的运算符相比具有更高的优先级,例如,Alternative类运算符<|>
的优先级较低,因此这些调用可以与<$>
相关联
至于关联性,这仅仅是运营商的使用方式。 $
通常用于更简单的函数组合。有人可能会将f $ g $ x
写为f (g x)
。而<$>
几乎总是与<*>
链接,而infixl 4
也是(+) <$> [1, 2, 3] <*> [10, 20, 30]
。这样,以下语句是有效的。
((+) <$> [1, 2, 3]) <*> [10, 20, 30]
由于左侧关联性,该表达式将解析为以下内容。
(+) <$> ([1, 2, 3] <*> [10, 20, 30])
这正是我们想要的。函数(+)是curry并接受两个应该逐个传递的参数。如果具有正确的关联性,则会发生以下情况。
StorageFile
这表示将第一个列表中的所有数字应用于第二个列表中的数字,然后将结果添加到......某事。毋庸置疑,这不会发生变形。