真实世界中的接合组织形态预编程的实际应用

162

是的,这些

{-#LANGUAGE TypeOperators, RankNTypes #-}
import Control.Morphism.Zygo
import Control.Morphism.Prepro
import Control.Morphism.Histo
import Control.Functor.Algebra
import Control.Functor.Extras
import Control.Functor.Fix
import Control.Comonad.Cofree

zygohistomorphic_prepromorphism 
  :: Functor f
  => Algebra f b
  -> GAlgebra f (ZygoT (Cofree f) b) a 
  -> (f :~> f) 
  -> FixF f 
  -> a
zygohistomorphic_prepromorphism f 
  = g_prepro (distZygoT (liftAlgebra f) (distHisto id))

我知道它们是( HHOS )笑话。但我正在寻找一个现实世界的例子,用于简单的黑客价值,并且最后,但并非最不重要的一点,将其添加到维基中并说明“这是表达XYZ的惯用方法”。如果你无法提供解决方案,我会为此设置悬赏。如果你对它们完全不了解,Edward在Reddit上发布了简短的解释

符合条件的答案必须:

  1. 至少具有某种程度上的理论计算实用性。也就是说,归约为id的答案不行。

  2. 使用方案的所有功能,不能传递id、const或等效物。

  3. 不能同样适用于简单的、普通的fold或类似方法,因此不要用曲折的方式来实现product等。

加分项:

  • 著名问题或算法

  • 用不同寻常的方式解决或表达

  • 在清晰度和/或性能以及/或黑客价值和/或乐趣方面获得加分,大致按此顺序,以及

  • 高排名答案(民主万岁)

请注意下面的Edward's answer。你可以选择使用哪个ZHPM实现。


5
如果您在您的栈中包括了"IO",我们就可以使用SimonPJ著名的"launchMissles"函数。但我想所有那些超级纯净抽象的废话的重点都是为了避免这种可能性。 - Yitz
6
好的,a 可以是任何东西,因此可以构造一个 IO 值,根据对输入数据的评估来策略性地发射导弹。 - barsoap
51
我点击了这个问题,因为我完全不知道你在说什么。 +1 绅士,+1 - Drew
7
有人想使用所有组件的话,最好手动编写出一个“配备纺锤形前置映射递归”的展开方式,然后寻找需要所有这些模式的问题;命令式循环 tend to do arbitrarily complicated tracking,因此它们可能是寻找这些问题的好地方。 - Edward Z. Yang
3
更重要的是——它能混合吗?!(非常抱歉,忍不住要说) - n00b
我应该因为不理解这一切而感到愚蠢吗? :D - Cosmin
2个回答

56

从快速浏览中,我认为我看到了他们在跟踪DRSP时如何使用histo(以与简单的foldr查看其已构建的列表的方式相同),但是prepro对我来说不是立即显而易见的。你能详细说明一下吗?(如果可能的话,能否给出我们可以添加到维基页面上的简短代码?) - barsoap
3
代码可以在首页勘误表下方的链接中找到。zygomorphism 的实际定义在 Main.hs 文件中,它与论文中的定义不同。它只是一个 zygomorphism 而不是“zygohistomorphic prepromorphisms”——我见过的最接近现实世界应用的东西就是 zygomorphism。虽然 Jevgeni Kabanov 有一些使用 histomorphisms 进行动态编程的幻灯片: http://www.cs.ioc.ee/~tarmo/tday-viinistu/kabanov-slides.pdf - stephen tetley

41

注意,这些的签名已经更改,因为它不够通用,并且我将其包含在我的递归方案包中(作为一个玩笑)。

zygoHistoPrepro 
  :: (Unfoldable t, Foldable t) 
  => (Base t b -> b) 
  -> (forall c. Base t c -> Base t c) 
  -> (Base t (EnvT b (Stream (Base t)) a) -> a) 
  -> t
  -> a

实现也得到了简化。
zygoHistoPrepro f = gprepro (distZygoT f distHisto)

通过使用distGHisto,放松对(Base t)-Branching流的约束条件,从新实现中可以很明显地看出如何实现一个广义的zygohistomorphic预形态。


7
啊,是的,非常明显。 - Ben Longo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接