【发布时间】:2019-10-20 13:56:27
【问题描述】:
(这不是专门的 Haskell 问题。)
我有一个递归数据结构。我想在每个级别附加一些额外的信息。这是一个简化的示例,其中我将X 或Y 添加到树的每个级别:
import Data.Functor.Foldable
data Wrap a = X a | Y a
deriving Show
data TreeF a b = Leaf a | TreeF a b b
deriving Show
depth1 :: Wrap (TreeF Int ())
depth1 = X (Leaf 1)
depth2 :: Wrap (TreeF Int (Wrap (TreeF Int ())))
depth2 = Y (TreeF 1 (X $ Leaf 1) (Y $ Leaf 1))
-- depthInfinity :: Fix something something ...
(TreeF 的定义对我来说是不自然的。我更愿意定义 data Tree a = Leaf a | Tree a (Tree a) (Tree a),但如果我这样做,我不知道如何陈述我的问题。所以我写了它以Base 函子的形式,也就是Data.Functor.Foldable。)
Wrap 类型可用于将信息X 或Y 附加到某种数据。 depth1' 是一个深度 1 TreeF,其中 Wrap 标志已附加在每个级别(它只有一个级别)。 depth2 是一个深度为 2 的 TreeF,其中Wrap 标志已附加到每个级别(它有两个级别)。
如何创建任意深度的“环绕树”?我应该如何写它的类型签名?这种数据混搭有类别理论术语吗?
【问题讨论】:
标签: haskell category-theory recursive-datastructures fixpoint-combinators