АК
Size: a a a
АК
И
АК
И
И
И
АК
АК
АК
И
И
LessThan a 'Zero = ('False ~ 'True)АК
АК
Fin n, как во всяких туториалах по языкам с зависимыми типамиАК
data Fin (n :: Nat) where
FZ :: Fin n
FS :: Fin n -> Fin ('Succ n)
getAt3 :: Vector a ('Succ n) -> Fin n -> a
getAt3 (x :| _) FZ = x
getAt3 (x :| xs) (FS m) = getAt3 xs m
main = do
print $ getAt3 (1 :| 2 :| 3 :| Nil) (FS $ FS FZ)
И
Fin вроде полный аналог SNat из задачи.И
И
:k! LessThan ('Succ ('Succ ('Succ 'Zero))) ('Succ ('Succ 'Zero))
LessThan ('Succ ('Succ ('Succ 'Zero))) ('Succ ('Succ 'Zero)) :: Constraint
= LessThan ('Succ 'Zero) 'Zero
И как конкретно компилятор обработает вот этот констрейнт`LessThan ('Succ 'Zero) 'Zero` я даже не представляю.И
:k! LessThan ('Succ ('Succ ('Succ 'Zero))) ('Succ ('Succ 'Zero))
LessThan ('Succ ('Succ ('Succ 'Zero))) ('Succ ('Succ 'Zero)) :: Constraint
= ('False ~ 'False, ('True ~ 'False, ('False ~ 'False, () :: Constraint)))
а это ('False ~ 'False, ('True ~ 'False, ('False ~ 'False, () :: Constraint))) уже вроде нормальный констрейнт получаетсяАК