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)`