【发布时间】:2016-04-16 17:44:36
【问题描述】:
当你想从数据结构中拉出一个元素时,你必须给出它的索引。但是index的含义取决于数据结构本身。
class Indexed f where
type Ix f
(!) :: f a -> Ix f -> Maybe a -- indices can be out of bounds
例如...
列表中的元素具有数字位置。
data Nat = Z | S Nat
instance Indexed [] where
type Ix [] = Nat
[] ! _ = Nothing
(x:_) ! Z = Just x
(_:xs) ! (S n) = xs ! n
二叉树中的元素由一系列方向标识。
data Tree a = Leaf | Node (Tree a) a (Tree a)
data TreeIx = Stop | GoL TreeIx | GoR TreeIx -- equivalently [Bool]
instance Indexed Tree where
type Ix Tree = TreeIx
Leaf ! _ = Nothing
Node l x r ! Stop = Just x
Node l x r ! GoL i = l ! i
Node l x r ! GoR j = r ! j
在玫瑰树中寻找东西需要通过在每个级别从森林中选择一棵树来逐步降低级别。
data Rose a = Rose a [Rose a] -- I don't even like rosé
data RoseIx = Top | Down Nat RoseIx -- equivalently [Nat]
instance Indexed Rose where
type Ix Rose = RoseIx
Rose x ts ! Top = Just x
Rose x ts ! Down i j = ts ! i >>= (! j)
好像一个产品类型的索引是求和(告诉你看产品的哪个臂),一个元素的索引是单位类型,嵌套类型的索引是一个产品(告诉你你在哪里查看嵌套类型)。总和似乎是唯一一个与derivative 无关的。总和的索引也是一个总和 - 它告诉您用户希望找到总和的哪一部分,如果违反该预期,您将剩下少量 Nothing。
事实上,对于定义为多项式双函子的不动点的函子,我已经成功地实现了!。我不会详细介绍,但是当f 是Indexed2 的实例时,Fix f 可以成为Indexed 的实例...
class Indexed2 f where
type IxA f
type IxB f
ixA :: f a b -> IxA f -> Maybe a
ixB :: f a b -> IxB f -> Maybe b
...事实证明,您可以为每个双函子构建块定义Indexed2 的实例。
但到底发生了什么?函子与其索引之间的潜在关系是什么?它与函子的导数有何关系?是否需要了解theory of containers(我真的不需要)才能回答这个问题?
【问题讨论】:
-
我真的不认为列表是按数字索引的(这个
Nothing相当难看)。对我来说,xs的列表由Fin (length xs)或this 之类的东西索引。那么索引只是相应容器中的位置。对于列表Shape = ℕ和Position = Fin,即您得到的正是Fin (length xs),因为列表的形状就是它的长度。
标签: haskell functor generic-programming