Как пара объединяется с типами функций Arrow? - PullRequest
1 голос
/ 27 января 2011

Некоторые функции для работы со стрелками довольно удобны для использования на парах.Но я не могу понять, как типы этих функций объединяются с парой.В общем, я нахожу типы функций, связанных со стрелкой, довольно запутанными.

Например, у нас есть first :: a b c -> a (b, d) (c, d), что для меня мало что значит.Но его можно использовать, скажем, для увеличения первого числа в паре:

Prelude Control.Arrow> :t first (+1)
first (+1) :: (Num b) => (b, d) -> (b, d)

И

Prelude Control.Arrow> :t (&&&)
(&&&) :: (Arrow a) => a b c -> a b c' -> a b (c, c')

Prelude Control.Arrow> :t (pred &&& succ)
(pred &&& succ) :: (Enum b) => b -> (b, b)

Может кто-нибудь объяснить, как это работает?

Ответы [ 3 ]

2 голосов
/ 27 января 2011

Есть экземпляр для Arrow (->).Таким образом,

(&&&) :: (Arrow a) => a b c -> a b c' -> a b (c,c')

имеет экземпляр

(&&&) :: (->) b c -> (->) b c' -> (->) b (c,c')

или, в более условном обозначении,

(&&&) :: (b -> c) -> (b -> c') -> (b -> (c,c'))

Остальное должно следовать из этого.1012 * Я использую функции стрелок (особенно (***) и (&&&)) все время в экземпляре (->).Я использую эти комбинаторы для любого другого случая Arrow очень редко.Поэтому всякий раз, когда вы видите a b c, подумайте «(обобщенная) функция от b до c», которая работает и для обычных функций.

2 голосов
/ 27 января 2011

Первая стрелка берет нормальную стрелку и изменяет ее для выполнения своей операции над первым элементом в кортеже и выводит результат в виде стрелки

a b c -> a (b, d) (c, d)

a b c -- is the input arrow, an operation that maps type b to c
a (b, d) (c, d) -- is the output arrow, an operation that maps a tuple (b, d) to (c, d)

он использует d как пустышку для неизвестного второго типа в кортеже

&&& берет две стрелки, которые принимают один и тот же вход, и создает стрелку, которая принимает этот вход, дублирует его в кортеж и запускает одну из стрелок в каждой части кортежа, возвращая измененный кортеж.

для некоторого твердого руководства, проверьте: http://www.vex.net/~trebla/haskell/hxt-arrow/lesson-0.xhtml

1 голос
/ 27 января 2011

Я недавно опубликовал этот пост о том, как использовать функции Arrow в чистых функциях

http://blog.romanandreg.com/post/2755301358/on-how-haskells-are-just-might-just-be-function

Я пытаюсь охватить все основные методы Arrow очень простым и подробным способом.

Приветствие.

...