具有类似于QuickCheck的promote
函数(即形式为以下形式的函数)的结构的仿函数的总称是什么:
promote :: (a -> f b) -> f (a -> b)
(这是
flip $ fmap (flip ($)) :: f (a -> b) -> (a -> f b)
的反函数)。除了(->) r
和Id
之外,甚至还有具有此类操作的仿函数吗? (我确定一定有)。谷歌搜索“quickcheck升级”仅打开了QuickCheck文档,而在任何更一般的上下文AFAICS中都没有提供promote
。在SO中搜索“快速检查升级”不会产生任何结果。 最佳答案
到目前为止,我发现了使用f
态态构造promote
的以下方法:
f = Identity
promote
,则该对仿函数h t = (f t, g t)
也具有promote
,则合成h t = f (g t)
也具有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?