zygohistomorphic prepromorphisms在现实世界中的应用


156

是的,这些

{-#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)的笑话。我正在寻找一个简单的黑客价值的真实示例,最后但并非最不重要的一点是,将其添加到Wiki中,并说“这是表达XYZ的惯用方式”。如果您无法提出解决方案,我对此予以奖励。如果您完全不了解他们的意思,那么Edward会在reddit上发布简短说明

合格答案必须:

  1. 至少在理论上和远程上做一些有用的事情。也就是说,减少到的答案id就消失了。

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

  3. 不能简单地通过简单的香草褶皱等表达出来,所以不要仅仅product以曲折的方式实现。

奖励积分将给予:

  • 众所周知的问题或算法

  • 以不寻常的方式解决或表达了

  • 清晰度和/或性能

  • 和/或骇客价值

  • 和/或lulz,大致按此顺序,以及

  • 高阶答案(是的,民主制)

另请注意以下爱德华的答案。您使用哪种ZHPM实现是您的选择。


5
如果您已将其包含IO在堆栈中,则可以使用SimonPJ的著名launchMissles功能。但是我想所有超纯抽象废话的全部要点是避免发生这种情况。
伊茨

6
好吧,a可以是任何东西,因此可以随意构建一个IO值,该IO值可以根据对输入数据的评估来战略性地发射导弹。
barsoap 2011年

49
我点击了这个问题,因为我不知道你在说什么。+1好先生,+ 1
Drew

7
希望使用所有组件的人会很好地手动写出一个纯合子预形递归扩展到的内容,然后寻找需要所有这些模式的问题。命令式循环往往会进行任意复杂的跟踪,因此它们可能是一个很好的观察对象。
Edward Z. Yang

3
更重要的是-它会融合吗?(非常抱歉,无法抗拒)
n00b

Answers:


52

莎朗·柯蒂斯(Sharon Curtis)和穆新成(Shin-Cheng Mu)拥有一枚功能性明珠,使用同态来找到最大密集段(最大段总和的概括)。一旦您习惯了Zygomorphism,它就很适合滑动窗口问题。

http://www.iis.sinica.edu.tw/~scm/2010/functional-pearl-maximally-dense-segments/

我提名作者来获得额外的荣誉,因为他们避免使用定点Mu函子。


从略读过程中,我认为我看到了他们在跟踪DRSP时如何使用histo(从某种意义上来说,一个简单的人foldr可以查看它已经构建的列表),但是prepro对我而言并不是立即显而易见的。你能详细说明吗?(并且,如果可能的话,提供简短的代码,可以添加到Wiki页面上吗?)
barsoap 2011年

3
该代码可从登录页面勘误下方的链接中获得。zygomorphism的实际定义在文件Main.hs中-与本文中的定义不同。它只是“同构”而不是“同构预形”-同构是我在现实世界中使用过的最接近的事物。尽管有耶夫格尼·卡巴诺夫(Jevgeni Kabanov)使用组织态进行动态编程的幻灯片: cs.ioc.ee/~tarmo/tday-viinistu/kabanov-slides.pdf
斯蒂芬·泰特利2011年

39

请注意,这些签名已更改,因为它的通用性不足,我在递归方案包中包括了它(作为一个玩笑)。

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)

从新的实现中,应该显而易见的是,如何通过使用代替来放宽对流的约束,从而实现广义的拟组态预原形。(Base t)-BranchingdistGHisto


2
是的,很明显。
Ben Longo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.