9

什么是用于与类似于快速检查的promote功能,即,形式的功能的结构的函子的总称:QuickCheck的推广功能的一般情况是什么?

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

(这是flip $ fmap (flip ($)) :: f (a -> b) -> (a -> f b)倒数)。除了(->) rId以外,是否还有任何具有此类操作的仿函数? (我确定必须有)。谷歌搜索'快速检查推广'只是出现了QuickCheck文档,在任何更通用的语境AFAICS中都没有给出promote;搜索“快速检查促进”没有结果。

+0

Is ['sequenceA'](http://hackage.haskell.org/package/base-4.7.0.1/docs/Data-Traversable.html#v:sequenceA)是否相关? – 2014-10-08 21:36:15

+0

让我看看。代入'sequenceA'的类型,我们可以得到't =( - >)a'和'f = f'。所以如果'( - >)a'有一个'Traversable'实例,这个函数对于所有'a'都是存在的。尽管如此,我认为'Traversable(( - >)a)'需要'(有界,一个枚举)'或等价物。 – 2014-10-08 22:11:39

+1

值得一提的是,[universe](http://hackage.haskell.org/package/universe)包系列提供[必需的Traversable实例](http://hackage.haskell.org/package/universe -reverse-实例-1.0 /文档/ SRC /数据宇宙-实例-Traversable.html)。 – 2016-04-05 20:48:12

回答

1

到目前为止,我发现与promote射构建f这些方法:

  • f = Identity
  • 如果f和g都有promote则对仿h t = (f t, g t)也做
  • 如果f和g都有promote那么组成h t = f (g t)
  • 如果f具有promote财产和g是一个Ÿcontrafunctor则函子h t = g t -> f tpromote财产

最后一个属性可以推广到profunctors克,但那么f会仅仅是一个profunctor,所以它可能不是非常有用,除非你只需要profunctors。现在

,使用这四个结构中,我们可以找到它promote存在仿函数f的例子很多:

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?

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

由于Monad的是更强大的比应用型的接口,这告诉我们,a -> f b可以做更多的事情比f (a -> b)。这告诉我们一个(a -> f b) -> f (a -> b)类型的函数不能是内射的。以手挽手的方式,域比共域大。这意味着你不可能保存函数的行为。它只是不能在泛型函子中使用。

当然,您可以表征该操作是内射的函子。 Identity(->) a当然是例子。我敢打赌,有更多的例子,但没有立即跳出来。

1

Data.Distributive

class Functor g => Distributive g where 
    distribute :: Functor f => f (g a) -> g (f a) 
    -- other non-critical methods 

重命名你的变量,你会得到

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

使用的清晰度稍微无效的语法,

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

(c ->)Functor,所以promote类型是的distribute的类型的一种特殊情况。因此每个Distributive仿函数都支持你的promote。我不知道是否有支持promote但不支持Distributive

+2

“分配”比“促销”严格得多。每个'Distributive'函子'g'都可以表示:也就是说,存在一个常量类型'b',使得'g t = b - > t'。然而,诸如g t =(t - > a) - > t'的函子具有“提升”,但不能表示,因此不能成为“分配”。更一般地说,定义为g t = c t - > h t的函子'g'具有'推广',如果'c'是任何反函数并且'h'具有'推广'。只有当'c'是一个常数(反)函数时,这个结构才能定义'Distributable'。 – winitzki 2016-09-24 01:22:01