當您想從數據結構中提取元素時,必須給出索引。但索引的含義取決於數據結構本身。索引到容器中:數學基礎
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
。
實際上,我一直在成功實現!
,一般用於定義爲多項式雙函數的固定點的函子。我不會進入細節,但Fix f
可製成Indexed
實例時f
是Indexed2
實例...
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](http://lpaste.net/160209)索引的。然後,索引只是相應容器中的位置。對於列表'Shape ='和'Position = Fin',即你完全得到'Fin(length xs)',因爲列表的形狀是它的長度。 – user3237465