Anonymous
(и выполняет monadic laws!)
Anonymous
Заставить их выполнить, к сожалению нечем, у нас тут не Agda
Alexander
кстати, а агду ктонибудь уже пробовал?
Alexander
есть смысл переключится с хаскеля на нее и попробовать разорбаться?
Anonymous
Надеюсь, что в тему:
наткнулся на список блогов, сравнивающих Х. с другими языками:
https://wiki.haskell.org/Blog_articles/Comparisons
Кабачок
Anonymous
Цель другая:
Agda из этой оперы:
https://en.m.wikipedia.org/wiki/Proof_assistant
Хаскель для.., ну, много чего. Но скорее не для формальных доказательств
Alexander
ну вы уж меня извените, но цель хаскеля явно не в написании когда
Alexander
это proof of concept
Alexander
то что код можно писать это совпадение
Alexander
а вообще,ч ем круче система типов тем круче язык
Anonymous
.. О, оказывается, Agda написана на Хаскеле
Alexander
я хочу язык, где можно указать тип "целое число от 1 до 20"
Alexander
и чтобы тайпчекал выход за границу массива, например
Alexander
вопрос, если есть комонады значит где то есть и контрмонады?
Anonymous
https://hackage.haskell.org/package/contravariant-1.4.1 контрмонад нет, есть контрафункторы, контр-аппликативы и контр-альтернативы
Anonymous
Warning: Kmett's code ahead
Alexander
ну там суть в том, что функторы это кофункторы
Alexander
типа функторы это "могу писать + fmap" а контрфунктор "могу читать + fmap"
Alexander
в полном соответствии с семантикой ко- и контр- вариантных типов
A64m
Alexander
хотя это то просто
Alexander
ну в общем, в хаскеле изначально компилятор был интереснее самого языка
A64m
ну нет, во-первых, пруфом этого концепта был LML, во вторых ghc делать стали позже чем хаскель. В 80-е установили что можно сделать практически полезный ленивый ФЯ, хаскель был уже платформой для дальнейшего экспериментирования, можно ли вообще более-менее эффективно компилировать такие ФЯ - такого вопроса уже не было, это не хаскельный эксперимент
Alexander
значит меня обманули :(
Alexander
но вообще там была аналогия с тем, что пролог тоже сделали но эксперимент не удался и получилось говно лютое
Aliester
пролог как будто не для людей делали
Alexander
нужен уточняющий смайлик, не могу распарсить ирония это или утверждение :(
Aliester
ну я на нем в свое время писал нейросети простенькие
Aliester
на слабо от препода
Aliester
так-то мы на питоне писали, но я вызвался на прологе
Alexander
и как, эффективно?
Alexander
я кстати на удивление часто слышу пролог именно в связке с machine learning
Aliester
оказалось рекурсия и имутабельность вместе с процессом выполнения как достижения целей вполне подходят итеративным процесам достижения вменяемого респонса нейронов нейросети
Alexander
я короче разобрался, комонадами называются контрмонады
Aliester
плюс мутабельность там раз и обчелся и вполне может быть описана гармоническим рядом
Alexander
так как контрафункторы раньше назывались кофункторами, думаю дело тут нечисто
Alexander
Aliester
не уверен. это тот язык в котором любой опыт в другом программировании только мешает
A64m
но вообще там была аналогия с тем, что пролог тоже сделали но эксперимент не удался и получилось говно лютое
ну а у экспериментов 80-х с ФЯ результаты были сносные, так что вопрос можно ли вообще такое делать уже потом не стоял
| | RT | y | fib | prim |
| | | | 20 | 300 |
| ------- | --------- | --- | ---- | ---- |
| C | | | 0.46 | 0.2 |
| LML | G-machine | 84 | 0.92 | 0.5 |
| LML | G-machine | 88 | 0.78 | 0.26 |
| VAX ML | FAM | 84 | 0.5 | 1.2 |
| SML/NJ | cmachine | 88 | 0.4 | 0.38 |
| Franz | | | | |
| Lisp | | | 1.1 | 1.1 |
| SASL | SECD | 84 | 31 | 20 |
| LCF ML | Stanford | | | |
| | LISP | 84 | 46 | 29 |
| Miranda | S-K | 88 | 72 | 12.3 |
A64m
вот у ФЯ 70-х производительность была вообще никакая (в этой таблице это LCF ML и SASL)
A64m
мирандовый рантайм это тоже изобретение 70-х, сам язык новее
кана
кана
контр в функторах это скорее исключение, контрмонад нет (насколько я знаю)
кана
именно ко обозначает переворачивание стрелок
кана
а контр в кофункторах показывает не сколько дуальность, сколько контрвариантность
Alexander
разве разворот стрелки не делает ковариантные штуки контрвариантными?
Alexander
в этом же вроде бы и суть
кана
моноид ковариантен?
Alexander
моноид инвариантен по идее
кана
ну собственно я к тому, что не думаю, что на все, что дуально, можно отнести к ко и контрвариантному
кана
это две разные характеристики, которые пересеклись на функторах (по случайности)
Alexander
а, я понял смысл нотации
Alexander
это омонимы
кана
Alexander
ну, технически, математики все дуальное любят называть ковариантом и контрвариантом
Alexander
типа у них такой Either
Sergey
Всем привет, как записать Int в файл? Можно даже побайтно
кана
writeFile "./file" $ show 2
?
Vladislav
Vladislav
Контрафункторы это функторы в дуальную категорию, а вот кофункторы это дуал самих функторов. Функторы дуальны самим себе, так что кофункторы = функторы.
кана
ох, вот оно че
Vladislav
Комонады это дуал монад, но они все еще в категории эндофункторов, а не в категории контрафункторов
Vladislav
Я не уверен, что контрафункторы образуют категорию вообще. По крайней мере очевидным образом не образуют.
Vladislav
Поэтому о контравариантных монадах речь вести не приходится.
Антон
делает вид, что всё понимает, и кивает с умным видом
Vladislav
Я могу объяснить если меня спрашивать ;)
Антон
так, функтор — отображение категории, сохраняющее до некоторой степени структуру, эндофунктор — функтор из категории в неё же. Пока всё верно?
Vladislav
Функтор это отображение одной категории в другую, да. Объекты в объекты, морфизмы в морфизмы, равенства в равенства (сохранение структуры композиции и id)
Vladislav
Эндофунктор из категории в себя, да.
Антон
Категория эндофкнуторов — очевидно... А контрафункторы тогда что?
Vladislav
Контрафункторы это отображение категории в обратную категорию
кана
хм, мы же можем сказать про некую любую категорию, обратна она или нет, получается контрафунктор всегда отображает в обратную этой же категории?
Vladislav
Эндофунктор над C это C -> C
Контрафунктор над C это C -> Op(C) или Op(C) -> C (не важно)
Vladislav
Для любой категории C, например Hask
Vladislav
Vladislav
В изоляции ты не определишь, категория обратная или нет, это не её собственное свойство
Vladislav
на примере Hask
1. определим категорию H1 так, что объекты в ней типы в Хаскеле с кайндом *, а стрелки между объектами A B это функции A -> B (с оговорками про bottom)
2. определим категорию H2 так, что объекты в ней типы в Хаскеле с кайндом *, а стрелки между объектами A B это функции B -> A (с оговорками про bottom)
Vladislav
H1 и H2 это обратные (opposite) категории