具有类似QuickCheck的promote
函数结构的仿函数的一般术语是什么,即形式的函数:
promote :: (a -> f b) -> f (a -> b)
(这是flip $ fmap (flip ($)) :: f (a -> b) -> (a -> f b)
的倒数)。除了(->) r
和Id
之外,是否还有任何具有此类操作的仿函数? (我确定一定有)。谷歌搜索'快速检查推广'只显示了QuickCheck文档,该文档在任何更一般的上下文AFAICS中都没有给出promote
;搜索SO以便快速检查促销'没有结果。
答案 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
promote
,那么对编码器h t = (f t, g t)
也会promote
,那么合成h t = f (g t)
也会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)
promote :: (c -> g a) -> g (c -> a)
重命名变量,你得到
promote :: ((c ->) (g a)) -> g ((c ->) a)
为清晰起见,使用略微无效的语法,
(c ->)
Functor
是promote
,因此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>
。