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',正确的优先级。你能看出为什么这是自然的吗?
我试图找出 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',正确的优先级。你能看出为什么这是自然的吗?