Haskell 是否可以为延续单元转换器提供一个具有一些和许多的替代实例?

Haskell 是否可以为延续单元转换器提供一个具有一些和许多的替代实例?,haskell,applicative,continuation-passing,some-and-many,alternative-functor,Haskell,Applicative,Continuation Passing,Some And Many,Alternative Functor,我们可以将延续单元转换器定义为 data Cont r m a = Cont {run :: (a -> m r) -> m r} 如果m是Alternative的成员,我们可以通过 empty = Cont $ \f -> empty ca <|> cb = Cont $ \f -> run ca f <|> run cb f 显然不起作用(他们甚至不进行类型检查)。是否有其他方法使用它们(如果我们需要m也成为monad,那就好了) 作为参考

我们可以将延续单元转换器定义为

data Cont r m a = Cont {run :: (a -> m r) -> m r}
如果
m
Alternative
的成员,我们可以通过

empty = Cont $ \f -> empty
ca <|> cb = Cont $ \f -> run ca f <|> run cb f
显然不起作用(他们甚至不进行类型检查)。是否有其他方法使用它们(如果我们需要
m
也成为monad,那就好了)

作为参考,
some
many
必须是方程的最小解:

  • some v=(:)v many v
  • many v=some v pure[]
假设
some::ma->m[a]
many::ma->[a]
满足这一规律,那么
some::Cont r m a->Cont r m[a]
many::Cont r m a->Cont r m[a]
No.

这里没有箭头

(forall a. f a -> f [a]) ->
(forall r. ((a -> f r) -> f r)) -> (([a] -> f r) -> f r)`
这以一种有趣的方式利用了它的论点


所有a的唯一位置
。f a->f[a]
可应用于
f r
。这些是
(a->fr)->fr
的结果,就像您的“显而易见的选项”和
([a]->fr)
。这将留下类型为
f[r]
的结果。唯一可以用
forall r完成的事情。备选方案f=>f[r]
生成一个
f r
是对
f[r]
进行索引,并对所有r使用部分函数
。[r] ->r
从一个自然数到另一个没有更大的自然数。

如果
r
有一些额外的结构,也许可以做些什么。例如,也许我们可以
fmap折叠
f[r]
,并使用合适的相干定律,这些定律可以是等价的。我不同意
some ca=Cont$\fla->run ca$\a->(some$pure a)>>=fla
有点有趣。问题是这是否是一个有效的
some
实例。您无法从
f[a]
中获得
[a]
,就像
some$pure a
一样,仅使用
备选方案f
约束。你需要
Monad f
Traversable f
来处理它。@luqui是的,这就是为什么我对所有r
s的
都非常明确。我提到我对
f
作为
Monad
很满意。尽管如此,这篇文章还是很有用的,它显示了
Monad
实际上甚至需要它来进行类型检查。
(forall a. f a -> f [a]) ->
(forall r. ((a -> f r) -> f r)) -> (([a] -> f r) -> f r)`