Haskell中`->`,`=`和``的优先顺序是什么?

时间:2019-05-18 21:12:51

标签: haskell operator-precedence

我正在尝试在Haskell中找出一些默认的运算符优先级,但无法在->=上找到一些好的文档(如{{1 }})。因此,我在GHCI中尝试了f x:i (->)来获取一些信息,但这给了我一个语法错误。

显然,这些“令牌”只是语法的内置部分,因此,难怪:i (=)无效。

我是Haskell的新手,所以我并不知道:i不会返回任何值,我只是错误地认为,它在命令式语言中的行为等同于它。当然是错误的。

另一方面,

=->充当运算符。它们分别返回类型/值和右/左关联。与实际运算符一起使用时,它们具有某种表现。

1 个答案:

答案 0 :(得分:9)

  • ->是类型级别的运算符((->) :: * -> * -> *),如注释中所述,:i (->)揭示它是infixr 0 *。
  • 可以将函数应用程序视为具有“无限高”的左优先级,也就是说,如果%是任何运算符,那么无论如何,f x % y都将始终读为(f x) % y优先级%拥有,并且f x y z始终读为((f x) y) z。**没有记录为具有优先级,因为它不是运算符,并且“无限”优先级可以不会在Haskell中声明。
  • =不能被认为具有优越性,因为它始终是声明而不是表达式,因此在其周围加上括号是荒谬的。它不是运算符,因此不能具有优先级。

*正如下面的注释中指出的那样,它的行为实际上好像具有优先级infixr -1,但这在普通运算符中是不允许的-这是语法而不是语义。 < / p>

**请注意,这是->的“对面”,可以看作具有“无限低”的右优先级。你能明白为什么这很自然吗?