Haskell 使用括号来消除像'liftM b ap c'这样的表达式的歧义`
在Haskell期间,以下工作:Haskell 使用括号来消除像'liftM b ap c'这样的表达式的歧义`,haskell,frege,Haskell,Frege,在Haskell期间,以下工作: > (+) `liftM` (Just 3) `ap` (Just 5) Just 8 弗雷格提示使用偏执: frege> (+) `liftM` (Just 3) `ap` (Just 5) E <console>.fr:12: invalid expression, none-associative operator liftM found on same level as none-associative operator
> (+) `liftM` (Just 3) `ap` (Just 5)
Just 8
弗雷格提示使用偏执:
frege> (+) `liftM` (Just 3) `ap` (Just 5)
E <console>.fr:12: invalid expression, none-associative operator liftM
found on same level as none-associative operator ap
H <console>.fr:12: Use parentheses to disambiguate an expression like a
liftM b ap c
frege>(+)`liftM`(只有3个)`ap`(只有5个)
E.fr:12:表达式无效,无关联运算符liftM
在与无关联运算符ap相同的级别上找到
H.fr:12:使用括号来消除像
liftM b ap c
我在以下内容中找到此部分:
包含中缀运算符的表达式由
操作员的固定性(见第4.4.2节)。连续无定论
具有相同优先级的运算符必须同时为左或右
关联以避免语法错误。给予一个没有激情的
表达式“x qop(a,i)y qop(b,j)z”,必须在其周围添加括号
当i=j时,“x qop(a,i)y”或“y qop(b,j)z”,除非a=b=l或
a=b=r
在上面的代码中,两个“运算符”都没有关联性,并且具有相同的默认优先级,因此看起来Frege的行为与Haskell report一致
我理解得对吗?为什么弗雷格在这种情况下需要括号,而哈斯克尔能够消除歧义?或者Haskell是如何在这种情况下消除歧义的?好吧,这是因为,目前来看,
`foo`
在Frege中默认为非关联性,而在Haskell中是左关联性
这应该在Frege编译器中进行更正,以使它更兼容Haskell。我认为这两个都应该是左关联的(通过将它们放在反勾中),因此它是
(+)`liftM`(仅3))`ap`(仅5)
-也许弗雷格确实看到了这种不同,就像这里回答的问题一样:-你同意吗?@Carsten谢谢!我确实看到了那个问题,但我在问题中引用的话肯定忽略了,也混淆了,因为它说“给定了一个未加修饰的表达式……必须加上括号”。我再次检查了您链接的问题和Haskell报告,现在清楚了。