Почему Haskell не допускает более сложные выражения инфикса? - PullRequest
1 голос
/ 13 мая 2019

Почему Haskell не допускает более сложные инфиксные выражения, например,

xs `zipWith (+)` ys
l `f 0 0` r

Похоже, что floated как минимум с 2007 года.

Эта страница предполагает, что это из-за проблем с синтаксическим анализом вложенных выражений инфикса, например.

x `a `f` b` y

Но я не нашел ни одного «официального» источника для обсуждения этого вопроса.Это определенно причина, и это исключает что-либо кроме того, что у нас есть в настоящее время?Очевидно, что одним простым решением было бы позволить любому выражению, которое само по себе не содержит никакой инфиксной нотации, но является ли оно слишком специальным?Является ли неоднозначность непреодолимой для компилятора или просто считается, что любые потенциальные выгоды не стоят усилий?Я не могу сразу думать о сопоставимой конструкции т.е.где жетоны "start" и "end" совпадают, и, таким образом, решена ли это проблема или нет.

1 Ответ

4 голосов
/ 13 мая 2019

Может быть подделано

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]
...