Я возился с простой тензорной библиотекой, в которой я определил следующий тип.
data Tensor : Vect n Nat -> Type -> Type where
Scalar : a -> Tensor [] a
Dimension : Vect n (Tensor d a) -> Tensor (n :: d) a
Векторный параметр типа описывает «размеры» или «форму» тензора. В настоящее время я пытаюсь определить функцию для безопасного индексирования в Tensor
. Я планировал сделать это с помощью Fin
s, но столкнулся с проблемой. Поскольку Tensor
имеет неизвестный порядок, мне может понадобиться любое количество индексов, для каждого из которых требуется своя верхняя граница. Это означает, что Vect
индексов будет недостаточно, потому что каждый индекс будет иметь свой тип. Это побудило меня вместо этого взглянуть на использование кортежей (называемых «парами» в Идрисе?). Я написал следующую функцию для вычисления необходимого типа.
TensorIndex : Vect n Nat -> Type
TensorIndex [] = ()
TensorIndex (d::[]) = Fin d
TensorIndex (d::ds) = (Fin d, TensorIndex ds)
Эта функция работала так, как я ожидал, вычисляя соответствующий тип индекса из вектора размерности.
> TensorIndex [4,4,3] -- (Fin 4, Fin 4, Fin 3)
> TensorIndex [2] -- Fin 2
> TensorIndex [] -- ()
Но когда я попытался определить настоящую index
функцию ...
index : {d : Vect n Nat} -> TensorIndex d -> Tensor d a -> a
index () (Scalar x) = x
index (a,as) (Dimension xs) = index as $ index a xs
index a (Dimension xs) with (index a xs) | Tensor x = x
... Идрис выдвинул следующую ошибку во втором случае (как ни странно, в первом случае все было в порядке).
Type mismatch between
(A, B) (Type of (a,as))
and
TensorIndex (n :: d) (Expected type)
Ошибка, по-видимому, подразумевает, что вместо того, чтобы рассматривать TensorIndex
как чрезвычайно запутанный синоним типа и оценивать его так, как я надеялся, он рассматривал его так, как если бы он был определен с помощью объявления data
; так сказать "типа черного ящика". Где Идрис подводит черту? Есть ли способ переписать TensorIndex
, чтобы он работал так, как я хочу? Если нет, можете ли вы придумать другой способ написать функцию index
?