奇怪的优先权和相关性

时间:2015-07-11 02:32:26

标签: haskell

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

infixr 0 $
infixl 1 &
infixl 4 <$>
infixl 1 <&>

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

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

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

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