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

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

仿函数或应用仿函数有类似的例子吗?也就是说 fg 的组合是一个仿函数(或应用仿函数),即使
  • fg 之一不是(应用)仿函数,另一个是,或
  • 他们都不是(应用)仿函数,
  • 最佳答案

    这不是(协变)仿函数

    f x = x -> r
    

    f . f 是“延续”仿函数(也是一个 monad):
    f (f x) = (x -> r) -> r
    

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

    关于haskell - 两个非仿函数可以组成一个仿函数吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25958042/

    10-09 02:54