Как пара объединяется с типами стрелочных функций

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

Например, у нас есть 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)

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


person David Powell    schedule 27.01.2011    source источник


Ответы (3)


Есть экземпляр для 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'))

Остальное должно следовать из этого.

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

person luqui    schedule 27.01.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

person amccausl    schedule 27.01.2011

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

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

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

Ваше здоровье.

person Roman Gonzalez    schedule 27.01.2011