Khi bạn muốn lấy phần tử ra khỏi cấu trúc dữ liệu, bạn phải cung cấp chỉ mục của nó. Nhưng ý nghĩa của chỉ số phụ thuộc vào cấu trúc dữ liệu.Lập chỉ mục vào vùng chứa: nền tảng toán học
class Indexed f where
type Ix f
(!) :: f a -> Ix f -> Maybe a -- indices can be out of bounds
Ví dụ ...
yếu tố trong một danh sách có vị trí số.
data Nat = Z | S Nat
instance Indexed [] where
type Ix [] = Nat
[] ! _ = Nothing
(x:_) ! Z = Just x
(_:xs) ! (S n) = xs ! n
Các phần tử trong cây nhị phân được xác định theo trình tự chỉ đường.
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
Tìm kiếm thứ gì đó trong cây hồng đòi hỏi phải giảm từng cấp một bằng cách chọn cây từ rừng ở mỗi cấp.
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)
Dường như chỉ số của một loại sản phẩm là một sum (nói cho bạn mà cánh tay của sản phẩm để nhìn vào), chỉ số của một phần tử là loại đơn vị, và chỉ số của một loại lồng nhau là một sản phẩm (cho bạn biết nơi để tìm trong loại lồng nhau). Số tiền có vẻ là người duy nhất không được liên kết với số điện thoại derivative. Chỉ mục của tổng cũng là một tổng - nó cho bạn biết phần nào của tổng số người dùng hy vọng sẽ tìm thấy, và nếu kỳ vọng đó bị vi phạm, bạn còn lại với một số ít là Nothing
.
Trong thực tế, tôi đã thực hiện một số thành công khi thực hiện !
chung cho các functors được định nghĩa là điểm cố định của một bifunctor đa thức. Tôi sẽ không đi sâu vào chi tiết, nhưng Fix f
thể được thực hiện một thể hiện của Indexed
khi f
là một thể hiện của 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
... và nó quay ra bạn có thể xác định một thể hiện của Indexed2
cho mỗi của các khối xây dựng bifunctor.
Nhưng điều gì đang thực sự xảy ra? Mối quan hệ cơ bản giữa functor và chỉ mục của nó là gì? Làm thế nào nó liên quan đến đạo hàm của functor? Có cần phải hiểu theory of containers (mà tôi không, thực sự) để trả lời câu hỏi này?
tôi không thực sự nghĩ rằng danh sách được lập chỉ mục bởi số (này 'Nothing' là khá xấu xí). Với tôi một danh sách 'xs' được lập chỉ mục bởi một trong hai' Fin (length xs) 'hoặc một cái gì đó như [this] (http://lpaste.net/160209). Sau đó, chỉ số chỉ đơn giản là vị trí trong vùng chứa tương ứng. Đối với các danh sách 'Hình dạng = ℕ' và' Vị trí = Vây', tức là bạn nhận được chính xác 'Vây (độ dài xs)', vì hình dạng của một danh sách là độ dài của nó. – user3237465