web-dev-qa-db-ja.com

接合組織型前型の実世界での応用

はい、 これらのもの

{-#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を表現する慣用的な方法です」というウィキに追加します。私willは、解決策を見つけられなかった場合にこれに報奨金をかけます。あなたが彼らが何をしているのかについて完全に失われた場合、エドワードはredditに 短い説明 を投稿しました。

適格な回答は:

  1. 少なくともリモートで理論的に計算上有用なことを行います。つまり、idに還元される答えが出ています。

  2. スキームのすべての機能を使用し、id、const、または同等のものを渡さないでください。

  3. 単純なバニラの折り目などで同様にうまく表現できないため、単にproductを蛇行した方法で実装しないでください。

ボーナスポイントは次のものに与えられます:

  • 既知の問題またはアルゴリズム

  • 解決され、それぞれ表現され、得られる異常な方法で

  • 明快さおよび/またはパフォーマンス

  • および/またはハック値

  • および/またはlulz、おおよそその順序で、

  • 上位の回答(いや民主主義)

以下に注意してください エドワードの答え 以下。どのZHPM実装を使用するかはあなたの選択です。

155
barsoap

シャロンカーティスとシンチェンムーは、極度に密なセグメント(最大セグメント合計の一般化)を見つけるために接合型を使用する機能的真珠を持っています。 Zygomorphismsは、慣れてきたらスライディングウィンドウの問題に適しているようです。

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

固定小数点Muファンクターの使用を回避したため、著者に追加のクレジットを指名します。

52
stephen tetley

これらの署名は、あまり一般的ではなかったため変更されており、(冗談として) recursion-schemes パッケージに含まれていることに注意してください。

_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)-Branching_ストリームがあるという制約を緩和することにより、generalizedzygohistomorphic prepromorphismを実装する方法が明らかになるはずです。代わりにdistGHisto

39
Edward KMETT