
Index
11.09.2017
23:52:22
Хотя я называю эти директории lib и exe, для ясности.

Aleksey
12.09.2017
06:12:27
Можно в app класть собственно Main. И, скажем, описания CLI, парсер файлов конфигурации, вот это всё. И то только в том случае, когда пакет планируется использовать ещё и как библиотеку и не хочется засорять последнюю описанием опций командной строки конкретного приложения

Yuriy
12.09.2017
08:59:10
instance Monad m => Category (Kleisli m) в стандартной библиотеке — это представление категории монад в Хаскелле, которое вы тут ищете?

Google

Yuriy
12.09.2017
08:59:36
@strobegen ^
в случае со стэком можно вообще не использовать никакие темплэйты
хочешь проект — echo {} > stack.yaml
хочешь пакет — echo {} > project.yaml
и дальше по подсказкам сборщика

Index
12.09.2017
09:02:27
@cblp_su категория Клейсли — это не категория монад
в категории монад объекты вроде Maybe, [], или State, а стрелки — type m ~> n = forall a. (Monad m, Monad n) => m a -> n a
в категории Клейсли объекты такие же, как в Hask (все типы в *), но стрелки Kleisli вместо ->

Evgeniy
12.09.2017
09:05:24
пока вот нашел такую архивную дискуссию на подобную тему
https://mail.haskell.org/pipermail/haskell-cafe/2007-December/036340.html
но еще не успел ознакомится

Index
12.09.2017
09:39:18
Не уверен, как лучше выразить T-алгебру (и возможно ли это в сегодняшнем Haskell).

Evgeniy
12.09.2017
09:55:35
а вообще ктонибудь видел чтобы https://hackage.haskell.org/package/adjunctions или adjunction из category-extracts использовалась для каких то практических задач а не только для того чтобы сделать что то типа http://chrispenner.ca/posts/adjunction-battleship?
ни как не могу найти место на ментальной карте для этого, с одной стороны штука сугубо теоритическая но с другой все же есть потенциально практические применения

Sherzod
12.09.2017
10:57:38
Чуваки, вам девушка не нужна?
Держите. Не благодарите!

Google

ParkeT
12.09.2017
10:58:49
Спасибо.

Aleksey
12.09.2017
10:59:05
(забрал стикеров)

Alex
12.09.2017
11:36:47
чот не раскрыты темы профункторов и гистоморфизмов

Sherzod
12.09.2017
11:37:35

Alex
12.09.2017
11:37:57
профунктор это бифунктор, контравариантный по первому параметру

Sherzod
12.09.2017
11:38:29

Alex
12.09.2017
11:38:38
а гистоморфизм это схема рекурсии учитывающая предыдущие результаты
https://jtobin.io/time-traveling-recursion

Sherzod
12.09.2017
11:39:44

Alex
12.09.2017
11:40:42
типа того но произвольной глубины
для факториала вроде бы достаточно параморфизма

Index
12.09.2017
11:42:04

Дмитрий
12.09.2017
11:43:23
Про профункторы как раз таки было понятнее всего предыдущего)

Sherzod
12.09.2017
11:43:25

Index
12.09.2017
11:43:45
Что в них сложного?

Yuriy
12.09.2017
11:43:58
придумай слова попроще

Дмитрий
12.09.2017
11:44:11
Потому что это абстракция для которой уже давным давно закончились какие-то приземлённые аналогии

Index
12.09.2017
11:44:31
Да вроде и слово несложное

Дмитрий
12.09.2017
11:44:33
Примерно в этот момент и придёт понимание почему именно так а не проще

Google

Sherzod
12.09.2017
11:44:37
придумай слова попроще
профунктор это бифунктор, контравариантный по первому параметру
^ всё сложно
Из всего только "функтор" в голову лезет. Объект, который можно вызвать (функтор в спп)

Yuriy
12.09.2017
11:44:40
можно говорить «плюшечка» вместо «профунктор», но это не сделает его понятнее

Дмитрий
12.09.2017
11:44:54
Контрплюшечка

Sherzod
12.09.2017
11:45:06

Vasiliy
12.09.2017
11:46:22
> Из всего только "функтор" в голову лезет. Объект, который можно вызвать (функтор в спп)
объект, который можно вызвать - функция, зачем придумывать такие сложные слова?

ParkeT
12.09.2017
11:46:32

Sherzod
12.09.2017
11:46:47

Index
12.09.2017
11:46:50
@Epikur В качестве эксперимента могу объяснить, что такое функтор (не в C++, а у здоровых людей), что такое бифунктор, что такое ко/контравариантность, и как из этого вытекает определение профунктора. Но взамен ты предложишь объективно более подходящие термины, чтобы новичку сразу по названию стало ясно, о чем речь

Sherzod
12.09.2017
11:47:06

Index
12.09.2017
11:47:23
А если не готов придумать, то зря только воду мутишь

Дмитрий
12.09.2017
11:47:26

Sherzod
12.09.2017
11:47:27

Дмитрий
12.09.2017
11:47:42
Он готов потому что не представляет в чем проблема

Sherzod
12.09.2017
11:47:45

Index
12.09.2017
11:47:48
Бэкграунд опиши свой. Haskell на каком уровне знаешь?

ParkeT
12.09.2017
11:47:53
Вообще, для начала нужно курить теоркат. Но, для написания кода, это не обязательно.

Sherzod
12.09.2017
11:47:56

Index
12.09.2017
11:48:04
Какой язык знаешь?

Sherzod
12.09.2017
11:48:08
книжку с солнышком пытался открыть
C#

Google

Дмитрий
12.09.2017
11:48:12

Sherzod
12.09.2017
11:48:32

Дмитрий
12.09.2017
11:48:38
))
Ясн

Alex
12.09.2017
11:48:42
не, там нашли фейл

ParkeT
12.09.2017
11:48:49

Sherzod
12.09.2017
11:48:55

Дмитрий
12.09.2017
11:49:06

Index
12.09.2017
11:49:20
Ок, C#. Я его плохо помню, но попробую что-нибудь сообразить. Представь себе всякие контейнеры — списки, деревья, массивы, и т.д — штуковины хранящие в себе элементы.
Добавь в кучу опциональные значения (по сути список из 0 или 1 элемента)

Sherzod
12.09.2017
11:49:38

Index
12.09.2017
11:50:02
Между ними общего то, что в них лежат элементы, и для них можно придумать функцию map, которая будет принимать делегат и применять к каждому элементу

Дмитрий
12.09.2017
11:50:08
Скорее !=
Нельзя придумать "понятные" термины если в языке просто кончились слова для подобных абстракций так же как нельзя доказать что PN = P, я в этом плане

Aragaer
12.09.2017
11:50:29
в доказательстве, что не равны, нашли фэйл. С другой стороны недавно проскочило, что задача про расстановку ферзей NP, но вроде как ее почти-почти решили, а это значит P=NP. Если я ничего не путаю

Sherzod
12.09.2017
11:50:40

Index
12.09.2017
11:50:47
Ну да, и так сойдет.

ParkeT
12.09.2017
11:51:20
Не, forEach предполагает сайдэффект :(

Index
12.09.2017
11:51:21
Я ее запишу вот так: map : (a -> b, T a) -> T b, обозначая стрелочкой функцию, а заглавной T контейнер

Дмитрий
12.09.2017
11:51:57

Index
12.09.2017
11:52:03
На вход имеем преобразование элемента типа a в элемент типа b, на выход имеем новый контейнер (с новыми элементами)

Google

Sherzod
12.09.2017
11:52:58
это Select что ли? Потому как ForEach ничего не возвращяет

Index
12.09.2017
11:53:44
Оно сохраняет форму, т.е. если на вход дерево, то и на выход дерево

Evgeniy
12.09.2017
11:54:20
да Select больше похож

Index
12.09.2017
11:54:31
если ты туда передашь делегат x => x, то получишь на выход исходную штуковину.

Sherzod
12.09.2017
11:54:32

Evgeniy
12.09.2017
11:54:36
Range(1, 10).Select(x => x * x);
выглядит как map

Index
12.09.2017
11:56:06
Так вот, для этой операции есть два закона
во-первых, если сделаешь map функцией x => x, то получишь исходную структуру
во-вторых, если сделаешь map f, а потом map g, где f и g это функции, то это равносильно тому, что ты сделаешь map (x => f(g(x)))
логично?

Sherzod
12.09.2017
11:56:38
нет
map (x => g(f(x))) так логично

Index
12.09.2017
11:57:26
ну да, да
Так вот, можно рассмотреть другие штуковины, кроме контейнеров, для которых возможно определить map
Например, можно сделать map одной функции на другую — это будет означать, что мы применяем их последовательно
оба закона выполняются
"последовательно" в смысле, что результат одной передается в другую

Sherzod
12.09.2017
11:59:52
каррирование? (слышал такое умное слово)

Index
12.09.2017
12:00:19
я записывал тип map вот так:
map : (a -> b, T a) -> T b
мы можем в качестве T взять Tree, List, Array, что-нибудь еще там. А можем взять сами функции
map : (a -> b, x -> a) -> (x -> b)
я подставил x -> в качестве T

Sherzod
12.09.2017
12:00:23
как это выглядит? f.map(x => g)?