两个非仿函数可以组成一个仿函数吗?

时间:2014-09-21 10:03:30

标签: haskell composition functor applicative category-theory

我们可以有两种类型f, g :: * -> *,这样它们不是monad,但它们的构成是。例如,对于任意固定的s

f a := s -> a
g a := (s, a)

g a不是monad(除非我们将s限制为monoid),但f (g a)是状态monad s -> (s, a)。 (与仿函数和applicative仿函数不同,即使fg都是monad,their composition might not be。)

仿函数或应用仿函数是否有类似的例子?这就是fg的构成是一个仿函数(或一个应用函子),即使

  1. fg中的一个不是(适用)仿函数,另一个是,或
  2. 它们都不是(应用)仿函数,

2 个答案:

答案 0 :(得分:8)

这不是(协变)仿函数

f x = x -> r

但是f . f是"继续"仿函数(也是一个monad):

f (f x) = (x -> r) -> r

这可能不是最好的例子,因为f是一个逆变函子。

答案 1 :(得分:7)

g :: *->*。然后Const A . g是任何A的仿函数,实际上与Const A同构。