首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现一个变体,以便它可以建立在返回类型的任何值之上(而不仅仅是大小写)

如何实现一个变体,以便它可以建立在返回类型的任何值之上(而不仅仅是大小写)
EN

Stack Overflow用户
提问于 2022-11-19 11:50:27
回答 1查看 64关注 0票数 3

我把变质作用定义如下:

代码语言:javascript
复制
-- Fixed point of a Functor 
newtype Fix f = In (f (Fix f))

deriving instance (Eq (f (Fix f))) => Eq (Fix f)
deriving instance (Ord (f (Fix f))) => Ord (Fix f)
deriving instance (Show (f (Fix f))) => Show (Fix f)

out :: Fix f -> f (Fix f)
out (In f) = f

-- Anamorphism
type Coalgebra f a = a -> f a

ana :: (Functor f) => Coalgebra f a -> a -> Fix f
ana f = In . fmap (ana f) . f

我现在必须写一个像这样的余代数:

代码语言:javascript
复制
appendListCoAlg :: (ListF' a, ListF' a) -> ListF a (ListF' a, ListF' a)
appendListCoAlg (In (ConsF a as), listb) = ConsF a (as, listb)
appendListCoAlg (In NilF, In (ConsF b bs)) = ConsF b (In NilF, bs)
appendListCoAlg (In NilF, In NilF) = NilF

在这里,必须从“基本情况”(NilF)中构造一个非质体。

我感兴趣的是是否有可能编写ana,这样我就可以列出以下内容:

代码语言:javascript
复制
appendListCoAlg :: (ListF' a, ListF' a) -> ?
appendListCoAlg (In (ConsF a as), listb) = ConsF a (as, listb)
appendListCoAlg (In NilF, **bs**) = **bs**
appendListCoAlg (In NilF, In NilF) = NilF

在这里,我可以返回一个类型为“早期”的值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-19 12:09:08

ana不允许您这样做。您可以使用apo (尽管它仍然不像可能的那样整洁;Either确实应该在外部)。

代码语言:javascript
复制
apo :: Corecursive t => (a -> Base t (Either t a)) -> a -> t
代码语言:javascript
复制
appendListCoAlg :: [a] -> [a] -> ListF a (Either [a] [a])
appendListCoAlg listb (a : as) = ConsF a (Right as)  -- Right: continue unfolding
appendListCoAlg listb [] = Left <$> project listb    -- Left: stop unfolding
代码语言:javascript
复制
append :: [a] -> [a] -> [a]
append lista listb = apo (appendListCoAlg listb) lista
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74499752

复制
相关文章

相似问题

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