データ構造から要素を取り出す場合は、そのインデックスを与える必要があります。しかし、のインデックスの意味は、データ構造そのものに依存します。例えばコンテナへの索引付け:数学的基盤
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
は、各レベルでの森林から木を選択することで、一度にレベル1を辞任することを伴います。
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
...
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
のインスタンスであるときFix f
はIndexed
のインスタンスを行うことができます...そして、それはあなたがそれぞれのIndexed2
のインスタンスを定義することができ判明しますbifunctorビルディングブロックの
しかし、実際に何が起こっていますか?ファンクタとそのインデックスとの間の根本的な関係は何ですか?ファンクタのデリバティブとはどのような関係がありますか?私はこの質問に答えるためにtheory of containers(実際にはそうではありません)を理解する必要がありますか?
(これは 'Nothing'はかなり醜いです)。私には 'xs'というリストは' Fin(length xs) 'や[this](http://lpaste.net/160209)のようなものでインデックスされています。インデックスは対応するコンテナ内の単純な位置になります。 'Shape =ℕ'と' Position = Fin'のリストの場合、リストの形状はその長さなので、正確に 'Fin(length xs)'を得ます。 – user3237465