Ограничения интерфейса для экземпляров интерфейса в Idris

#idris

#idris

Вопрос:

Я только начинаю изучать Idris из Haskell, и я пытаюсь написать какой-нибудь простой код линейной алгебры.

Я хочу написать экземпляр Num интерфейса для Vect , но специально для Vect n a с ограничением, у которого a есть Num экземпляр.

В Haskell я бы написал экземпляр класса типов следующим образом:

 instance Num a => Num (Vect n a) where
  ( ) a b = ( ) <$> a <*> b
  (*) a b = (*) <$> a <*> b
  fromInteger a = a : Nil
  

Но при чтении документов Idris interface, похоже, не упоминаются ограничения на экземпляры интерфейса.

Лучшее, что я могу сделать, это следующее, что предсказуемо заставляет компилятор жаловаться a на то, что он не является числовым типом:

 Num (Vect n a) where
  ( ) Nil Nil = Nil
  ( ) (x :: xs) (y :: ys) = x   y :: xs   ys
  (*) Nil Nil = Nil
  (*) (x :: xs) (y :: ys) = x * y :: xs * ys
  fromInteger i = Vect 1 (fromInteger i)
  

Я могу обойти это, создав свой собственный векторный тип с Num ограничением (который не является переносимым) или путем перегрузки ( ) в пространстве имен (что кажется немного неуклюжим):

 namespace Vect
  ( ) : Num a => Vect n a -> Vect n a -> Vect n a
  ( ) xs ys = ( ) <$> xs <*> ys
  

Есть ли способ ограничить реализации интерфейса или есть лучший способ добиться этого, например, используя зависимые типы?

Ответ №1:

В Idris вы бы сделали (почти) то же самое, что и haskell

 Num a => Num (Vect n a) where
  

Как и многие другие вещи, это есть в книге, но, по-видимому, нет в документах.

Комментарии:

1. Очень признателен! Я все равно планировал в какой-то момент получить копию, но, безусловно, беспокоит, что документы не завершены. Я мог бы обновить их, когда у меня появится такая возможность.