为什么';Haskell是否允许更复杂的中缀表达式?

为什么';Haskell是否允许更复杂的中缀表达式?,haskell,types,compiler-construction,type-inference,Haskell,Types,Compiler Construction,Type Inference,为什么Haskell不允许更复杂的中缀表达式,例如 xs `zipWith (+)` ys l `f 0 0` r 至少从2007年开始 表明这是因为解析嵌套中缀表达式时出现问题,例如 x `a `f` b` y 但我还没有找到任何“官方”来源来讨论这个问题。这确实是原因吗?它是否排除了我们目前所拥有的以外的任何东西?显然,一个简单的解决方案是允许任何表达式本身不包含任何中缀符号,但这是不是太特别了?这种歧义是编译器无法克服的,还是仅仅认为任何潜在的收益都不值得付出努力?我无法立即想到一个可

为什么Haskell不允许更复杂的中缀表达式,例如

xs `zipWith (+)` ys
l `f 0 0` r
至少从2007年开始

表明这是因为解析嵌套中缀表达式时出现问题,例如

x `a `f` b` y
但我还没有找到任何“官方”来源来讨论这个问题。这确实是原因吗?它是否排除了我们目前所拥有的以外的任何东西?显然,一个简单的解决方案是允许任何表达式本身不包含任何中缀符号,但这是不是太特别了?这种歧义是编译器无法克服的,还是仅仅认为任何潜在的收益都不值得付出努力?我无法立即想到一个可比较的构造,即“开始”和“结束”标记是相同的,因此它是否是一个已解决的问题。

它可能是伪造的

import Data.Function ( (&) ) -- = flip ($)

infixl 3
 <|,
 |>

(<|) :: a -> (a -> b) -> b
(<|) = (&)

(|>) :: (a -> b) -> (a -> b)
(|>) = ($)

as :: Num c => [c] -> [c] -> [c]
as xs ys = xs <|zipWith (+)|> ys

bs :: (Int -> Int -> a -> b -> c) -> (a -> b -> c)
bs f l r = l <|f 0 0|> r
import Data.Function((&))--=flip($)
中缀3
((a->b)->b
()::(a->b)->(a->b)
(|>) = ($)
as::Num c=>[c]->[c]->[c]
as xs ys=xs ys
bs::(Int->Int->a->b->c)->(a->b->c)
bs f l r=l r
另见

-->cs
-- [9,19,29,39,8,18,28,38]
政务司司长::[Int]
cs=[1..2][10,20..40]

“官方”讨论不会太正式。通常情况下,你在ICFP上谈论走廊讨论,在@haskell.org上发电子邮件。如果你愿意,那么就为GHC写一份提案和补丁集。我认为你不会找到比维基上更正式的答案。中缀表达式看起来像是一个小功能,可以说,它是有争议的我个人的头条准则是:引入“`(“和”)`”,这将是一个合理的扩展作为开始和结束令牌。它目前不允许在任何引号中放置任何东西,所以这不应该破坏任何现有代码,它应该使嵌套不含糊。但是,它是否可以引入一些新的歧义,还有一些问题,例如,考虑<代码>(FO)bar(BAZ)。当前有效且包含两个新标记…字符串是具有相同起始标记和结束标记的构造示例。这表明反斜杠转义是处理嵌套的一种可能性。不过我更喜欢Daniel Wagner建议的语法。我也倾向于“你就是不能嵌套它们”非解决方案,假定你总是可以使用<代码>让绑定以避免嵌套的需要,而且这可能是很多时候更清楚的。我有时想要这个特性。绝大多数时候,我想要一个简单的中间应用程序。一个很大的例子是<代码> xs'(LIFTA2F)'YS(我特别想要
liftA2
,而不是
fmap
的组合)。
infixl3
似乎很武断。为什么是3?我在搜索中看到了一些类似的东西(我想我应该提到它),但我在寻找更直接的答案,为什么它不作为语言的一部分存在(出于历史或实际原因)?
-- >> cs
-- [9,19,29,39,8,18,28,38]

cs :: [Int]
cs = [1..2] <^flip (-)^> [10,20..40]