Я общался с простой тензорной библиотекой, в которой я определил следующий тип.Вычисление нетривиального типа Идриса для индексации тензоров
data Tensor : Vect n Nat -> Type -> Type where
Scalar : a -> Tensor [] a
Dimension : Vect n (Tensor d a) -> Tensor (n :: d) a
Векторный параметр типа описывает «размеры» или «форму» тензора. В настоящее время я пытаюсь определить функцию для безопасного индексирования в Tensor
. Я планировал сделать это, используя Fin
с, но у меня возникла проблема. Поскольку 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
?
@Kwarrtz: Отвечено обновлено, чтобы использовать представление 'TensorIndex' + объяснение. – Cactus
Спасибо за обновление. Итак, просто чтобы уточнить, часть, которую я отсутствовала, была фактически неявным совпадением на 'ds'? – Kwarrtz
Если вы не соответствуете '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Но просто «Измерение» не говорит вам, следует ли уменьшить «TensorIndex ds» на второй или третий случай. – Cactus