Size: a a a

2021 October 24

АК

Анатолий Кот... in Haskell Start
та не
источник

И

Иван in Haskell Start
то вылезут эти самые ошибки
источник

АК

Анатолий Кот... in Haskell Start
вроде красным подсвечивает
источник

АК

Анатолий Кот... in Haskell Start
источник

И

Иван in Haskell Start
хм, сейчас еще раз посмотрю, но он пишет мне что Pattern match(es) are non-exhaustive
источник

И

Иван in Haskell Start
а с Minus типо получше вариант?
источник

И

Иван in Haskell Start
или есть еще какие то способы сделать что-то подобное?
источник

АК

Анатолий Кот... in Haskell Start
лучший вариант - это тот, где у меня хлс для этого метода анекзостив матч не подсвечивает
источник

АК

Анатолий Кот... in Haskell Start
а как он должен выглядеть - хз
источник

АК

Анатолий Кот... in Haskell Start
это лучше спросите в основном чате, там больше людей умеющих жонглировать на тайплевеле, чем в чате для новичков
источник

И

Иван in Haskell Start
Ок, спасибо. С Minus вроде такого нет. А вот твой вроде и подсвечивает non-exhaustive, но на каких то базовых примерах работает.
источник

И

Иван in Haskell Start
я кстати твой вариант вроде починил, там надо было в тайп фемили добавить еще 1 паттерн - LessThan a 'Zero = ('False ~ 'True)
источник
2021 October 25

АК

Анатолий Кот... in Haskell Start
та это, вроде, не важно - оно в обоих случаях в компайл тайме упадет
источник

АК

Анатолий Кот... in Haskell Start
лучший вариант - это скорее всего сделать с Fin n, как во всяких туториалах по языкам с зависимыми типами
источник

АК

Анатолий Кот... in Haskell Start
что-то вроде
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)
источник

И

Иван in Haskell Start
этот Fin вроде полный аналог SNat из задачи.
источник

И

Иван in Haskell Start
просто имя другое
источник

И

Иван in Haskell Start
Если честно, я в этой теме почти ничего не понимаю. В твоем решении если в LessThan передать первым аргментом "число" большее чем вторым аргументом, то получится нечто странное
: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` я даже не представляю.
источник

И

Иван in Haskell Start
а если добавить тот самый паттерн что я скинул, то получится такое:
: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))) уже вроде нормальный констрейнт получается
источник

АК

Анатолий Кот... in Haskell Start
> И как конкретно компилятор обработает вот этот констрейнт`LessThan ('Succ 'Zero) 'Zero` я даже не представляю.

Никак - просто ошибку кинет, если нужно что-бы был красивый констрент и внятное сообщение об ошибке есть https://hackage.haskell.org/package/base-4.15.0.0/docs/GHC-TypeLits.html#t:TypeError
источник