QuickCheck推广功能的一般情况是什么?

Jon*_*ast 9 haskell functional-programming functor quickcheck category-theory

具有类似QuickCheck promote功能的结构的仿函数的一般术语是什么,即形式的函数:

promote :: (a -> f b) -> f (a -> b)
Run Code Online (Sandbox Code Playgroud)

(这是反过来的flip $ fmap (flip ($)) :: f (a -> b) -> (a -> f b)).除了(->) r和之外,是否还有任何具有此类操作的仿函数Id?(我相信一定有).谷歌搜索'quickcheck promote'只显示了QuickCheck文档,该文档没有提供promote任何更一般的上下文AFAICS; 搜索"快速检查促销"的SO不会产生任何结果.

Car*_*arl 5

(<*>) :: Applicative f => f (a -> b) -> f a -> f b
(=<<) :: Monad m => (a -> m b) -> m a -> m b
Run Code Online (Sandbox Code Playgroud)

鉴于Monad比Applicative更强大的界面,这告诉我们a -> f b可以做更多的事情f (a -> b).这告诉我们类型的函数(a -> f b) -> f (a -> b)不能是单射的.该域以手动方式大于密码域.这意味着你无法保留函数的行为.它不适用于通用仿函数.

当然,您可以描述操作是单射的仿函数.Identity(->) a肯定的例子.我愿意打赌有更多的例子,但没有什么能立刻向我跳出来.


win*_*zki 1

到目前为止,我发现了使用态射构造 an 的这些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
Run Code Online (Sandbox Code Playgroud)

另请注意,该promote属性意味着该属性f是指向的。

point :: t -> f t
point x = fmap (const x) (promote id)
Run Code Online (Sandbox Code Playgroud)

本质上是同一个问题:函子的这个属性比单子更强吗?