通常你有类似 an Applicative
withoutpure
或类似 a Monad
, but without的东西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))
不可逆。不过,您认为这个较弱的类型类可能有用吗?从理论的角度来看,它甚至有意义吗?