我们可以有两种类型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仿函数不同,即使f
和g
都是monad,their composition might not be。)
仿函数或应用仿函数是否有类似的例子?这就是f
和g
的构成是一个仿函数(或一个应用函子),即使
f
和g
中的一个不是(适用)仿函数,另一个是,或答案 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
同构。