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

moo*_*ose 2 compiler-construction haskell types type-inference

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

xs `zipWith (+)` ys
l `f 0 0` r
Run Code Online (Sandbox Code Playgroud)

它似乎至少从 2007 年就开始浮动

此页面表明这是由于解析嵌套中缀表达式的问题,例如。

x `a `f` b` y
Run Code Online (Sandbox Code Playgroud)

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

Ice*_*ack 5

可以伪造

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
Run Code Online (Sandbox Code Playgroud)

另见InfixApplicative

-- >> cs
-- [9,19,29,39,8,18,28,38]

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