我正在尝试在Haskell中找出一些默认的运算符优先级,但无法在->
,=
和上找到一些好的文档(如{{1 }})。因此,我在GHCI中尝试了
f x
和:i (->)
来获取一些信息,但这给了我一个语法错误。
显然,这些“令牌”只是语法的内置部分,因此,难怪:i (=)
无效。
我是Haskell的新手,所以我并不知道:i
不会返回任何值,我只是错误地认为,它在命令式语言中的行为等同于它。当然是错误的。
=
和->
充当运算符。它们分别返回类型/值和右/左关联。与实际运算符一起使用时,它们具有某种表现。
答案 0 :(得分:9)
->
是类型级别的运算符((->) :: * -> * -> *
),如注释中所述,:i (->)
揭示它是infixr 0
*。%
是任何运算符,那么无论如何,f x % y
都将始终读为(f x) % y
优先级%
拥有,并且f x y z
始终读为((f x) y) z
。**没有记录为具有优先级,因为它不是运算符,并且“无限”优先级可以不会在Haskell中声明。=
不能被认为具有优越性,因为它始终是声明而不是表达式,因此在其周围加上括号是荒谬的。它不是运算符,因此不能具有优先级。 *正如下面的注释中指出的那样,它的行为实际上好像具有优先级infixr -1
,但这在普通运算符中是不允许的-这是语法而不是语义。 < / p>
**请注意,这是->
的“对面”,可以看作具有“无限低”的右优先级。你能明白为什么这很自然吗?