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

时间:2014-10-08 18:58:34

标签: haskell functional-programming functor quickcheck category-theory

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

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

(这是flip $ fmap (flip ($)) :: f (a -> b) -> (a -> f b)的倒数)。除了(->) rId之外,是否还有任何具有此类操作的仿函数? (我确定一定有)。谷歌搜索'快速检查推广'只显示了QuickCheck文档,该文档在任何更一般的上下文AFAICS中都没有给出promote;搜索SO以便快速检查促销'没有结果。

3 个答案:

答案 0 :(得分:5)

(<*>) :: Applicative f => f (a -> b) -> f a -> f b
(=<<) :: Monad m => (a -> m b) -> m a -> m b

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

当然,您可以描述操作是单射的仿函数。 Identity(->) a当然是榜样。我愿意打赌有更多的例子,但没有任何事情立刻向我跳出来。

答案 1 :(得分:1)

到目前为止,我发现了使用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属性

最后一个属性可以推广到profunctors g,但是f只是一个profunctor,所以它可能不是很有用,除非你只需要profunctors。

现在,使用这四种结构,我们可以找到许多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?

答案 2 :(得分:1)

Data.Distributive

promote :: (c -> g a) -> g (c -> a)

重命名变量,你得到

promote :: ((c ->) (g a)) -> g ((c ->) a)

为清晰起见,使用略微无效的语法,

(c ->)

Functorpromote,因此distribute的类型是Distributive类型的特例。因此,每个promote仿函数都支持您的promote。我不知道是否有任何支持Distributive但不支持<smil><head><meta base="rtmp://medya1.izmir.bel.tr/IBB_CANLI" /></head><body><switch live="true" isDVR="false"><video src="HalkapinarKavsagi.stream?wowzatokenstarttime=1474595548&wowzatokenendtime=1474655548&wowzatokenCustomParameter=myParameter&wowzatokenhash=IntLGCHdr-0yl7UMRjvf3aalPgNSs4pSd5vZfSBdViY=" system-bitrate="1080"/><video src="HalkapinarKavsagi.stream_480p?wowzatokenstarttime=1474595548&wowzatokenendtime=1474655548&wowzatokenCustomParameter=myParameter&wowzatokenhash=dtZSpAsFB3abC9AKqUvdVTFLqdhnkr4DuBPyU5I8TtY=" system-bitrate="480"/></switch></body></smil>