首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组织形式a la Mendler

组织形式a la Mendler
EN

Stack Overflow用户
提问于 2018-11-02 22:34:50
回答 1查看 149关注 0票数 3

使用来自histo的组织形式( http://hackage.haskell.org/package/recursion-schemes-5.0.3/docs/Data-Functor-Foldable.html ),我可以从初始列表中获得只包含奇数索引的a列表:

代码语言:javascript
复制
import Data.Functor.Foldable

odds :: [a] -> [a]
odds = histo $ \case
  Nil                           -> []
  Cons h (_ :< Nil)             -> [h]
  Cons h (_ :< Cons _ (t :< _)) -> h:t

如何使用mhisto获得相同的东西?

代码语言:javascript
复制
nil      = Fix Nil
cons a b = Fix $ Cons a b
list = cons 1 $ cons 2 $ cons 3 $ nil

modds :: Fix (ListF a) -> [a]
modds = mhisto alg where
   alg _ _ Nil = []
   alg f g (Cons a b) = ?
EN

回答 1

Stack Overflow用户

发布于 2018-11-03 05:03:07

就是这样:

代码语言:javascript
复制
modds :: Fix (ListF a) -> [a]
modds = mhisto alg
    where
    alg _ _ Nil = []
    alg odd pre (Cons a b) = a : case pre b of
        Nil -> []
        Cons _ b' -> odd b' 
代码语言:javascript
复制
GHCi> list = cata embed [1..10] :: Fix (ListF Int)
GHCi> odds (cata embed list)
[1,3,5,7,9]
GHCi> modds list
[1,3,5,7,9]

odd折叠列表的其余部分,而pre则挖掘前一项。请注意,门德勒代数中的y -> f y函数的可用性反映了Cofree在普通组织形式代数中的引入(在这种代数中,可以通过触及Cofree流的尾部来进行回挖):

代码语言:javascript
复制
cata  :: Functor f => (f c -> c) -> Fix f -> c
histo :: Functor f => (f (Cofree f c) -> c) -> Fix f -> c

mcata  :: (forall y. (y -> c) -> f y -> c) -> Fix f -> c
mhisto :: (forall y. (y -> c) -> (y -> f y) -> f y -> c) -> Fix f -> c 

有关mcatamhisto的进一步阅读,请参阅, by Varmo Vene的第5章和第6章。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53126614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档