Часто у вас есть что-то вроде Applicative
без pure
или что-то вроде Monad
, но без return
. Пакет semigroupoid охватывает эти случаи с Apply
и Bind
. Теперь я нахожусь в похожей ситуации с Arrow
, где я не могу определить осмысленную функцию arr
, но я думаю, что другие функции имели бы смысл.
Я определил тип, который содержит функцию и ее обратную функцию:
import Control.Category
data Rev a b = Rev (a -> b) (b -> a)
reverse (Rev f g) = Rev g f
apply (Rev f _) x = f x
applyReverse (Rev _ g) y = g y
compose (Rev f f') (Rev g g') = Rev ((Prelude..) f g) ((Prelude..) g' f')
instance Category Rev where
id = Rev Prelude.id Prelude.id
(.) x y = compose x y
Сейчас не могу реализовать Arrow
, а что-то послабее:
--"Ow" is an "Arrow" without "arr"
class Category a => Ow a where
first :: a b c -> a (b,d) (c,d)
first f = stars f Control.Category.id
second :: a b c -> a (d,b) (d,c)
second f = stars Control.Category.id f
--same as (***)
stars :: a b c -> a b' c' -> a (b,b') (c,c')
...
import Control.Arrow
instance Ow Rev where
stars (Rev f f') (Rev g g') = Rev (f *** g) (f' *** g')
Я думаю, что не могу реализовать эквивалент &&&
, так как он определен как f &&& g = arr (\b -> (b,b)) >>> f *** g
, а (\b -> (b,b))
необратим. Тем не менее, как вы думаете, может ли этот более слабый класс типов быть полезным? Имеет ли это смысл даже с теоретической точки зрения?
Arrow
функции не являются точно определением категории? - person Alexandre C.   schedule 09.08.2011Category
— это определение категории. Ну, в любом случае морфизмы (и никаких законов) — насколько я понимаю,Category
соответствует подкатегории Hask, которая имеет те же объекты (всех типов), но разные морфизмы.Arrow
добавляет гораздо больше структуры, но я не знаю достаточно, чтобы что-то сказать о том, что это за структура. - person Antal Spector-Zabusky   schedule 09.08.2011Category
указывает категорию, объекты которой являются объектами Hask со стрелками, заданными некоторым конструктором двумерного типа.Functor
описывает подкатегорию Hask, стрелки которой являются стрелками Hask с объектами, заданными некоторым конструктором одномерного типа.Applicative
сопоставляет моноидальную структуру(,)
сFunctor
, а(&&&)
и т. д. сопоставляет ее сCategory
. Иarr
дает функтор от Hask доCategory
. - person C. A. McCann   schedule 09.08.2011ArrowApply
делает декартовоCategory
закрытым, предоставляя всю мощь лямбда-исчисления со стрелками более высокого порядка, каррированием и т. д., а также возможность отображать все это из Hask вCategory
. Стрелки от неподвижного объекта дают тогда обычную монадную структуруReader
, вот почемуKleisli m a b
изоморфнаReaderT a m b
. - person C. A. McCann   schedule 09.08.2011Arrow
действительно не имеют продуктов. - person C. A. McCann   schedule 20.12.2011