我们可以有两种类型的 f, g :: * -> *
使它们不是 monad,但它们的组合是。例如对于任意固定的 s
:
f a := s -> a
g a := (s, a)
g a
不是monad(除非我们将s
限制为一个monoid),但是f (g a)
是状态monad s -> (s, a)
。 (与仿函数和应用仿函数不同,即使 f
和 g
都是单子(monad), their composition might not be 。)仿函数或应用仿函数有类似的例子吗?也就是说
f
和 g
的组合是一个仿函数(或应用仿函数),即使f
和 g
之一不是(应用)仿函数,另一个是,或 最佳答案
这不是(协变)仿函数
f x = x -> r
但
f . f
是“延续”仿函数(也是一个 monad):f (f x) = (x -> r) -> r
这可能不是最好的例子,因为
f
是一个逆变仿函数。关于haskell - 两个非仿函数可以组成一个仿函数吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25958042/