KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
Often you have something like an Applicative without pure , or something like a Monad , but without return . The semigroupoid package covers these cases with Apply and Bind . Now I'm in a similar situation concerning Arrow , where I can't define a meaningful arr function, but I think the other functions would make perfect sense. I defined a type that holds a function and it's reverse function: 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 Now I can't implement Arrow , but something weaker: --"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') I think I can't implement the equivalent of &&& , as it is defined as f &&& g = arr (\b -> (b,b)) >>> f *** g , and (\b -> (b,b)) isn't reversable. Still, do you think this weaker type class could be useful? Does it even make sense from a theoretical point of view?
Tags (comma-separated)
Save Edits
Cancel