为什么Haskell不允许使用更复杂的中缀表达式,例如
xs `zipWith (+)` ys
l `f 0 0` r
似乎至少从2007年开始floated。
This page表示这是由于解析嵌套的中缀表达式时出现问题,例如。
x `a `f` b` y
但是我没有找到任何“官方”来源来讨论它。这绝对是原因吗?是否排除了我们目前拥有的东西?显然,一种简单的解决方案是允许任何本身不包含任何中缀表示法的表达式,但这是临时的吗?编译器是无法消除歧义的,还是仅仅是认为任何潜在的收益都不值得付出努力?我无法立即想到可比的结构。 “开始”和“结束”标记的位置相同,因此是否解决了问题。
答案 0 :(得分:4)
可以伪造
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
另请参阅InfixApplicative
-- >> cs
-- [9,19,29,39,8,18,28,38]
cs :: [Int]
cs = [1..2] <^flip (-)^> [10,20..40]