Я пытаюсь создать тип Tensor
, но у меня возникают проблемы при работе с сигнатурой типа для конструктора. В этом и этом вопросе они определяют Tensor
как Vect
из Tensor
с, а в этом вопросе как псевдоним типа для вложенный Vect
с, но ни один не подходит для моих целей. Мне нужно, чтобы Tensor
был атомом c (он не сделан из других Tensor
s), и отличным типом (он не наследовал методы в силу своего псевдонима).
I попробовал следующее, которое неявно извлекает форму и тип данных из произвольно вложенного Vect
через array_type
и оборачивает его в минимальный Tensor
тип
import Data.Vect
total array_type: (shape: Vect r Nat) -> (dtype: Type) -> Type
array_type [] dtype = dtype
array_type (d :: ds) dtype = Vect d (array_type ds dtype)
data Tensor : (shape: Vect r Nat) -> (dtype: Type) -> Type where
MkTensor : array_type shape dtype -> Tensor shape dtype
, который я тогда определил различные функции, чтобы проверить, работает ли он вообще (не включены здесь). Все это прекрасно компилируется, но когда я пытаюсь определить функцию для умножения каждого элемента на два, я попадаю в настоящую путаницу. Я пытался сначала определить его для вложенного Vect
:
times_two : Num dtype => array_type shape dtype -> array_type shape dtype
times_two (x :: xs) = (times_two x) :: (times_two xs)
times_two x = 2 * x
, но я получаю
При проверке левой стороны times_two:
При проверке применение Main.times_two:
Невозможно устранить неоднозначность, поскольку ни одно имя не имеет подходящего типа:
Prelude.List. ::, Prelude.Stream. ::, Data.Vect. ::
Замена ::
на Data.Vect.::
не помогла. Возможно ли то, что я пытаюсь сделать? а толковый?