具有类似于QuickCheck的promote函数(即形式为以下形式的函数)的结构的仿函数的总称是什么:

promote :: (a -> f b) -> f (a -> b)

(这是flip $ fmap (flip ($)) :: f (a -> b) -> (a -> f b)的反函数)。除了(->) rId之外,甚至还有具有此类操作的仿函数吗? (我确定一定有)。谷歌搜索“quickcheck升级”仅打开了QuickCheck文档,而在任何更一般的上下文AFAICS中都没有提供promote。在SO中搜索“快速检查升级”不会产生任何结果。

最佳答案

到目前为止,我发现了使用f态态构造promote的以下方法:

  • f = Identity
  • 如果f和g都具有promote,则该对仿函数h t = (f t, g t)也具有
  • 如果f和g都具有promote,则合成h t = f (g t)也具有
  • 如果f具有promote属性,而g是任何矛盾者,则仿函数h t = g t -> f t具有promote属性

  • 可以将最后一个属性推广到g的发音器,但是f只会是一个发音器,因此它可能不是很有用,除非您只需要发音器。

    现在,使用这四种构造,我们可以找到存在f的仿函数promote的许多示例:
    f t = (t,t)
    
    f t = (t, b -> t)
    
    f t = (t -> a) -> t
    
    f t = ((t,t) -> b) -> (t,t,t)
    
    f t = ((t, t, c -> t, (t -> b) -> t) -> a) -> t
    

    另请注意,promote属性意味着f已指向。
    point :: t -> f t
    point x = fmap (const x) (promote id)
    

    本质上是相同的问题:Is this property of a functor stronger than a monad?

    10-06 01:00