Size: a a a

2021 March 31

L

Lierdakil in Haskell
Lierdakil
Или я торможу?
Не торможу

data Test
class SomeClass (a :: Type)
class (forall a. SomeClass a) => Cls a
instance SomeClass Test
instance Cls Test

Получаем No instance for (SomeClass a) в последней строчке, что вполне ожидаемо при обычных правилах области видимости для forall. Если переименовать class (forall a. SomeClass a) => Cls b эффект такой же, что тоже ожидаемо. Это разные переменные.
источник

AA

A64m AL256m qn<co... in Haskell
лол ульман и ахо выиграли ацм тюринг
источник

AA

A64m AL256m qn<co... in Haskell
надеюсь, что это первоапрельская шутка!
источник

NB

Nikolai Bragin in Haskell
Хопкрофт?
источник

AA

A64m AL256m qn<co... in Haskell
он по другой книжке соавтор же
источник

YP

Yuriy Pachin in Haskell
A64m AL256m qn I0
лол ульман и ахо выиграли ацм тюринг
Знакомые имена.
источник

YP

Yuriy Pachin in Haskell
Точно, книга про компиляторы.
источник

AA

A64m AL256m qn<co... in Haskell
вообще не только!
источник

DI

Dmitry Ivanov in Haskell
через десять лет может дядя боб выиграет
источник

L

Lierdakil in Haskell
кана
Обнаружилось, что на тайплевел хаскеле есть полноценные зависимые типы, в намного большем смысле чем просто "можно писать a -> (x :: a) -> ..."

Продолжаю изучать в поисках ограничений

Примеры:

- натуральные числа и несколько простых доказательств о коммутативности сложения и умножения:
https://gist.github.com/kana-sama/9185b30b45bd9817f11361e424a8abc7

- простое доказательство (x / 2) * 2 = x для всех четный натуральных чисел:
https://gist.github.com/kana-sama/b029dfa1b1665b207259b58588659a1a

- сигма-типы и работа с ними (тот же безопасный Half :: Even -> Nat)
https://gist.github.com/kana-sama/bd3ec6ddc19846665d9d1f632483550a

для сборки нужен ghc 8.10+

Из проблем:
- отсутствие лямбд приводит к тому, что все функции вида f (\x -> y) превращаются в специализированные топлевел функции, который делают то же самое
можно с глупыми вопросами поприставать? я теорию завтипов в голову себе ещё не загрузил до конца, поэтому вот смотрю я на последний пример и вижу фигу. Допустим хочу я быть уверен что в списке есть данный элемент. Что и куда надо приложить, чтобы проняло? В каком-нибудь Idris я мог бы написать что-то такое:

data Elem : a -> List a -> Type where
    Here : Elem x (x :: xs)
    There : (later : Elem x xs) -> Elem x (y :: xs)

data ListWith1T : Type where
    ListWith1 : (xs : List Int) -> { auto ok : Elem 1 xs } -> ListWith1T

test : ListWith1T
test = ListWith1 [0,1,2,3] -- ok

test2 : ListWith1T
test2 = ListWith1 [0,4,2,3] -- error

Понятно что тут ещё auto, на самом деле

test =
ListWith1
[0,1,2,3] (There Here)

но всё же.
источник

L

Lierdakil in Haskell
A64m AL256m qn I0
лол ульман и ахо выиграли ацм тюринг
Ну а что, книгу с драконом до сих пор вспоминают, хоть и есть там к чему придраться. Так что насчёт "profound impact on the field of computer science" всё верно, есть такой. Хороший он там или плохой этот самый impact можно спорить.
источник

к

кана in Haskell
Lierdakil
можно с глупыми вопросами поприставать? я теорию завтипов в голову себе ещё не загрузил до конца, поэтому вот смотрю я на последний пример и вижу фигу. Допустим хочу я быть уверен что в списке есть данный элемент. Что и куда надо приложить, чтобы проняло? В каком-нибудь Idris я мог бы написать что-то такое:

data Elem : a -> List a -> Type where
    Here : Elem x (x :: xs)
    There : (later : Elem x xs) -> Elem x (y :: xs)

data ListWith1T : Type where
    ListWith1 : (xs : List Int) -> { auto ok : Elem 1 xs } -> ListWith1T

test : ListWith1T
test = ListWith1 [0,1,2,3] -- ok

test2 : ListWith1T
test2 = ListWith1 [0,4,2,3] -- error

Понятно что тут ещё auto, на самом деле

test =
ListWith1
[0,1,2,3] (There Here)

но всё же.
ну, можно будет сделать ровно так же, только без auto)
источник

к

кана in Haskell
хотя может и вывести как-то получится
источник

к

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

к

кана in Haskell
или через сигму, не создавая новый тип
источник

AA

A64m AL256m qn<co... in Haskell
Dmitry Ivanov
через десять лет может дядя боб выиграет
дядя боб харпер
источник

L

Lierdakil in Haskell
А. Действительно довольно прямолинейно. Меня почему-то переклинило на type families и про GADTs я не то чтобы забыл, но в общем забыл. Спать наверное надо, а не компилятор насиловать. Спасибо!
источник

AA

A64m AL256m qn<co... in Haskell
кана
хотя может и вывести как-то получится
вместо авто тайпклассострадания надо писать
источник

к

кана in Haskell
а не выйдет
источник

к

кана in Haskell
а вот были бы закрытые тайпклассы - вышло бы
источник