Как реализовать сначала для ArrowApply?

В "Programming with Arrows" Хьюз утверждает

Прежде всего, обратите внимание, что как first, так и left легко реализуются с точки зрения приложения (подробности оставлены в качестве упражнения).

Из Control.Arrow left можно реализовать как:

leftApp :: ArrowApply a => a b c -> a (Either b d) (Either c d)
leftApp f = arr ((\b -> (arr (\() -> b) >>> f >>> arr Left, ())) |||
                 (\d -> (arr (\() -> d) >>> arr Right, ()))) >>> app

Как реализовать first только с arr, >>> и app?


person Matt    schedule 24.11.2014    source источник


Ответы (1)


Я думаю, что я понял, но мне было бы очень интересно, если есть более простое решение

firstApp :: ArrowApply cat => cat t t1 -> cat (t, t2) (t1, t2)
firstApp f = arr (\(x, y) -> (arr (\() -> (f, x))) >>>
                             app >>>
                             (arr (\v -> (v, y)))) >>>
             arr (\v -> (v, ())) >>>
             app
person Matt    schedule 24.11.2014
comment
Для меня не так просто реализовать обе функции через приложение. :) Я очень старался, но альтернативы не нашел. - person BarbedWire; 25.06.2017