У меня есть эта простая "стрелка":Неожиданный результат Когда Monoid на Arrows прикладываются
main = do
let
-- arr :: (Arrow a) => (b -> c) -> a b c
-- (>>>) :: Category cat => cat a b -> cat b c -> cat a c
-- (<+>) :: ArrowPlus a => a b c -> a b c -> a b c
-- infixr 5 <+>
-- infixr 1 >>>
-- runKleisli :: Kleisli m a b -> a -> m b
prepend x = arr (x ++)
append x = arr (++ x)
xform = (prepend "<") >>> (append ">") <+> (prepend "{") >>> (append "}")
xs = ["foobar"] >>= (runKleisli xform)
mapM_ putStrLn xs
В <+>
возвращается:
<foobar>}
{<foobar}
и если я заменить xform
с:
xform = ((prepend "<") >>> (append ">")) <+> ((prepend "{") >>> (append "}"))
Получаю:
<foobar>
{foobar}
Почему я получаю эти 2 результата? Даже глядя на infixr
s (как комментарии в коде) на самом деле не помогает.
[Это, вероятно, даст вам решение] (http://stackoverflow.com/questions/40331179/how-to-automatically-parenthesize-arbitrary-haskell-expressions). – Alec