AP
Size: a a a
AP
AP
v
YP
[
И
~)? Есть ли возможность констрейнтом указать что 2 типа не эквивалентны?JS
(a == b) ~ FalseИ
И
getAt, которая принимает вектор фиксированный длины (реализованные через Nat)Nat). И надо сделать, что бы все ошибки, связанные с выходом за границы вектора были во время компиляции.LessThan, которая берет 2 Nat типа, и создает Constraint, рекурсивно проверяя, что первый тип не равен второму и что уменьшенный на единицу первый тип не равен второму.Minus, которая вычитает из первого Nat типа второй и в самой функции сделать констрейнт (Minus m n ~ 'Zero) =>
Ни первый ни второй вариант завести не могу, натыкаюсь на разные ошибки, которые расшифровать у не получается.И
xs мог оказаться пустой вектор, а в типе стояло ограничение что вектор должен иметь такой тип - Vector a ('Succ n)И
getAt (x :| y :| xs) (SSucc m) = getAt (y :| xs) m для варианта с MinusИ
АК
type family LessThan (x :: Nat) (y :: Nat) :: Constraint where
LessThan 'Zero 'Zero = 'False ~ 'True
LessThan 'Zero b = ()
LessThan ('Succ a) ('Succ b) = LessThan a b
getAt2 :: (LessThan m n) => Vector a n -> SNat m -> a
getAt2 (x :| _) SZero = x
getAt2 (x :| xs) (SSucc m) = getAt2 xs m
main = do
print $ getAt2 (1 :| 2 :| 3 :| Nil) (SSucc $ SSucc SZero)
АК
И
И
И
И
Vector a ('Succ n)