Haskell中`->`、`=`和``的优先级是多少?

What is the precedence of `->`, `=` and ` ` in Haskell?

我试图找出 Haskell 中的一些默认运算符优先级,但我找不到关于 ->= 的一些好的文档(如 f x)。所以我在 GHCI 中尝试 :i (->):i (=) 来获取一些信息,但它给了我一个语法错误。

显然这些 "tokens" 只是语法的内置部分,所以难怪 :i 不起作用。

我是 Haskell 的新手,所以我不知道 = 没有 return 任何价值,我只是误以为它在命令式语言中的行为与其等价,这当然是错误的。

另一方面,

-> 充当运算符。它们 return 和 type/value 分别是 right/left 关联的。当与实际运算符一起使用时,它们具有某种优先权。

  • -> 是一个 type-level 运算符 ((->) :: * -> * -> *),正如评论中提到的,:i (->) 表明它是 infixr 0*.
  • Function application 可以被视为具有 'infinitely high' 左优先级,也就是说如果 % 是任何运算符,那么 f x % y 将始终被读取为 (f x) % y无论 % 有什么优先级,并且 f x y z 总是读作 ((f x) y) z。** 这没有记录为具有优先级,因为它不是运算符,并且 'infinite' 优先级不能在 Haskell.
  • 中声明
  • = 不能被视为具有优先权,因为它始终是 声明 而不是 表达式 ,因此放置括号周围是荒谬的。它不是运算符,因此不能有优先权。

* 正如下面的评论所指出的,这实际上表现得好像它具有优先权 infixr -1,但这在普通运算符中是不允许的——这是句法而非语义。

** 请注意,这是 -> 的 'opposite',它可以被视为具有 'infinitely low',正确的优先级。你能看出为什么这是自然的吗?