通常你有类似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))
是不可逆的。不过,你认为这个较弱的类型可能有用吗?从理论的角度来看,它甚至是有意义的吗?
是不是'箭头'功能完全是一个类别的定义? –
不,“类别”功能是一个类别的定义。好吧,无论如何(也没有规律) - 据我了解,“类别”对应于** Hask **的子类别,它具有相同的对象(所有类型),但具有不同的态射。 “箭头”增加了更多的结构,但我不知道什么样的结构。 –
@Antal S-Z:实际上不是子类别。 'Category'指定一个类别,其对象是** Hask **的对象,其中箭头由某个2-ary类型的构造函数给出。 'Functor'描述** Hask **的子类别,其箭头是** Hask **的对象,其中的对象由一些一元类型的构造函数给出。 'Applicative'将'(,)'的monoidal结构映射到'Functor',而'(&&&)'等映射到'Category'。 'arr'给出了一个函子,从** Hask **到'Category'。 –