我一直在阅读关于Haskell Applicative仿函数的理论解释的类别:显然,它们可以在类别理论术语中被解释为松散的闭合函子或松散的monoidal仿函数(取决于你问的人,看起来如此),并且这样做了我对以下内容感到疑惑.
不久之前,我写了一篇论文(与Ilya Sergey和我们的顾问Frank Piessens和Dave Clarke一起),使用Applicative仿函数在DSL中使用"效果递归"的递归原语,主要用于解析器库.我们发现我们需要一些非常特殊的构造函数,看起来它们可能是通用的(某种程度上).总之,我要问的是:下面的一些结构是否与类别理论有某种联系,如果是这样,如何?
请注意,我将写p ? q
两个applicative functor的组合p
和q
.
以下是我们在此过程中需要的基元列表:
afix:效果递归原语.我们真的想要一个看起来像这样的递归原语:
afix :: (p a ? p a) ? p a
然而,对于p
我们需要的更复杂的解释,这是无法实现的.相反,我们最终得到以下结果:
afix :: (? q. Applicative q ? p (q a) ? p (q a)) ? p a
显然,在这个参数化量化的应用函子q中包装递归出现的值强制了我们采用固定点的函数中的一种价值效应分离.显然,这足以使我们更复杂的功能发挥作用.
在实现中更深入,我们需要一种看似如下的共同运算符:
coapp0 :: (p a ? p b) ? p (a ? b)
但是,要求将其作为一般操作符p
,似乎只会将我们限制在只有琐碎的应用函数p.相反,我们注意到我们可以使用以下内容,这是可实现的:
coapp :: Applicative p ? (? q . Applicative q ? (p ? q) a ? (p ? q) b) ? p (a ? b)
总而言之:从类别理论的角度来看,以上是否有某种熟悉的东西?具体来说,对类型的功能的限制? q . Applicative q ? (p ? q) a ? (p ? q) b
而不是p a -> p b
似乎它可能是某种方式的根本?是否有任何链接可以帮助我们比以往更能了解这些内容?
关于上述以及我们如何使用它的文章中有更多细节,以防任何人感兴趣.