Size: a a a

2021 May 16

J

John Roe in Haskell
Я понимаю.
источник

ХГ

Хаскелль Моисеевич Г... in Haskell
Переслано от Хаскелль Моисеевич Г...
data Equality a b where
   R :: Equality a a

leftPlusZeroIsId :: SNat n -> Equality (Add Zero n) n
leftPlusZeroIsId _ = R

Задача: сделать такую же штуку для умножения на ноль слева. Делаю:

leftProdZeroisZero :: SNat n -> Equality (Product Zero n) Zero
leftProdZeroisZero _ = R

правильно?.. Тайпчек проходит.
источник

к

кана in Haskell
идея в чем, Product Zero n может быть вычислен тайпчекером, потому что функция Product матчит по первому аргументу, и первый аргумент тут в явном виде - Zero
поэтому Product Zero n и Zero равны по определению Product, поэтому тайпчекеру это ок для того чтобы просто использовать Refl, который требует чтобы значение слева и справа были равны

а вот например с (Product n Zero) :~: Zero так уже не выйдет, Product n Zero нельзя вычислить не зная n, поэтому тут нужно уже доказывать по индукции, в коде через рекурсию
источник

к

кана in Haskell
data N = Z | S N

data SN n where
 SZ :: SN Z
 SS :: SN n -> SN (S n)

type family n + m where
 Z + m = m
 S n + m = S (n + m)

congr :: forall f a b. a :~: b -> f a :~: f b
congr Refl = Refl

plus_left_id :: SN n -> Z + n :~: n
plus_left_id _ = Refl

plus_right_id :: SN n -> n + Z :~: n
plus_right_id SZ = Refl
plus_right_id (SS n) = congr @S (plus_right_id n)
источник

MK

Maxim Koltsov in Haskell
о, я смотрю кто-то таки стал решать лабу
источник

ХГ

Хаскелль Моисеевич Г... in Haskell
Где можно почитать?.. Вот например задача:

type IntSet = (Int -> Bool)
isMember :: IntSet -> Int -> Bool
isMember f x = f x

emptySet :: IntSet
emptySet x = ...
allInts :: IntSet
allInts x = ...
источник

ХГ

Хаскелль Моисеевич Г... in Haskell
Я стал.
источник

к

кана in Haskell
а че за лаба
источник

ХГ

Хаскелль Моисеевич Г... in Haskell
Аргонная :).
источник

к

кана in Haskell
источник

MK

Maxim Koltsov in Haskell
кажется мне эта статья не понравилась
источник

ХГ

Хаскелль Моисеевич Г... in Haskell
Ещё есть какие-то книги?.. В моей четвёрке ничего об этом нет и не гуглится.
источник

к

кана in Haskell
ну, я там не понял, как произошел плавный переход из k -> Maybe v в k -> v
источник

ЗП

Зигохистоморфный Пре... in Haskell
На канале твига Айзенберг как раз про это рассказывает
источник

к

кана in Haskell
о чем, о вот этих Equality? Тут нужно читать про type families, gadt, coercions
источник

ХГ

Хаскелль Моисеевич Г... in Haskell
Ага, благодарю.
источник

к

кана in Haskell
еще можно почитать про лямбда исчисление и как там выражаются числа, мапы, сеты, это буквально решение задачи будет
источник

ЗП

Зигохистоморфный Пре... in Haskell
Это тот, что лабы людям делает?
источник

ХГ

Хаскелль Моисеевич Г... in Haskell
Не тот, а я!
источник
2021 May 17

VD

Velvet Darkness in Haskell
Я кое-как написал такую вот жуткую функцию:
setByte :: forall (ix :: Nat) (width :: Nat). (9 <= width, ix + 1 <= width `Div` 8, KnownNat ix, KnownNat width) => NatRepr ix -> BV 8 -> BV width -> BV width
setByte ix val bv = Data.BitVector.Sized.or bv shifted
   where extendedVal = zext (knownNat @width) val
               shifted = shl (knownNat @width) extendedVal $ natVal (Proxy @ix) * 8
И у меня конпелятор ругается что первый аргумент (ix) - не используется.
В доке к NatRepr написано, что это A runtime presentation of a type-level Nat..
В теле функции ix как значение тоже не используется, насколько я понимаю, т.е. runtime presentation здесь действительно не нужен.
Одна если я просто уберу этот аргумент, то ругается could not deduce KnownNat ix0
Кто-нибудь может объяснить как можно убрать NatRepr ix из аргументов или я ошибаюсь в его ненужности?
источник