anton0xf
Java dev math fp tl:dr: Монада — это враппер с возможностью оперировать над завёрнутым значением. Если вы пишете на Java то уже наверняка знаете, что это. Никакой магии или скрытых смыслов.

Со мной щас случилось неожиданное. Т.к. я на Хаскелях и Скалах так никогда и не писал ничего длиннее пятка строк, то меня, как и большинство остальных людей несколько смущало понятие "монада". Хотя и знал уже, что по сути это всего лишь умное название для некоего враппера. Но всегда оставалось ощущение, что там есть какой-то более сложный нюанс, т.к. про всякие джавовые Optional и пр. обычно говорят "это близко, но не совсем оно", и добавляют с придыханием, что там есть ещё "монадические законы" и начинают разговор про Теорию Категорий, с которой у меня тоже как-то всё не складывается.
А тут на конфе в который раз зашла об этом речь, и я решил прикола для заглянуть в вику. Долистал до определения и всё понял!

java.util.Optional — это натурально монада. Как стримы и любой другой враппер, если к нему прицепить метод flatMap() с поведением, как у соответствующих методов Optional или Stream.

Раскрою на примере того самого Optional. Как пишут в вики монада `M` над типом `T` (пишут `M T`) — это тройка, состоящая из
1. конструктора типа (`M T`), т.е. например `Optional<T>`
2. конвертера `unit: T -> M T`. Напомню, что в стандартной математической нотации `f: X -> Y` — это функция из `X` в `Y`. Для моего примера это будет создание Optional из значения, т.е. в той же нотации: `Optional::<T>of : T -> Optional<T>`
3. и комбинатора `(>>=): (M T, T → M U) → M U`, т.е. функа, который употребляет монаду и другой функ, который из значения, в неё завернутого, делает другое значение, завёрнутое в эту же монаду, и применяет второе к содержимому первой. Т.е. в точности то, что делает Optional::flatMap, если понимать объект, у которого этот метод вызывается, как неявный первый аргумент. Точнее если у нас есть `x : Optional<T>` (переменная `x` типа `Optional<T>`), то `x::<U>flatMap : (T -> Optional<U>) -> Optional<U>` (или как пишут в javadoc: `Optional<U> flatMap​(Function<? super T,​? extends Optional<? extends U>> mapper)`), что отличается от сигнатуры в определении только тем, что `x` — это неявный параметр, поэтому его тип e у меня написан отдельно, но это исключительно синтаксическая особенность — в том же Python этот аргумент пишется в сигнатуре методов явно.

Ну а "законы" — это абсолютно тривиальные ожидаемые от врапера свойства:
+ `unit(x) >>= f <-> f(x)` — означает что flatMap() применяет свой аргумент с завёрнутому значению, а не делает что-то более хитрое: `Optional.of(x).flatMap(f) == f(x)`
+ `ma >>= unit <-> ma` — если есть переменная `x : Optional<T>`, то примерение `flatMap()` к `Optional::of` ничего не поменяет: `x.flatMap(Optional::of) == x`
+ `ma >>= λx → (f(x) >>= g) <-> (ma >>= f) >>= g` — некое правило ассоциативности применения `flatMap()`, т.е. если `x : Optional<T>`, и `f: T -> Optional<U>`, а `g: U -> Optional<V>`, то `x.flatMap(x -> f(x).flatMap(g)) == x.flatMap(f).flatMap(g)`
egplife
CS oop philosophy fp logic В сумме: Моя модель программиской гетеросмешаннойиерархии: ULTIMATESUPRAATMABRAHMAN->SOPHISMS->PLATON->MATH->COMPLEXITYLEVELS->ГЕТЕРОГЕНКА->GODLYFIRES->METAPHYSICALQUALITY->PHILOSOPHY->SCIENCES->PHYSICS->QUANTUMMECHANICS->И ТОЛЬКО ТУТ УЖЕ OBJECT, а Java начинается всего лишь с OBJECT

OBJECT->FUNCTION
OBJECT->PROCESS

#philosophy #oop #fp #logic #cs #programming #science #moq #brahman #parabrahman #supra #ultimate #ultimateartifact #artifact #metaphilosophy #java
gbdj
fp clojure Вот единственное что мне не нравится в первотэге, это сообщения об ошибках. Неосторожное движение — и тебя забрызгивает кишками JVMа.
ymn
fp sml А есть ли у кого-нибудь "Modern Compiler Implementation in ML"? Хотел было полистать, но не смог нагуглить, лол.
lovesan
Питер SPb fp drinkup А тащемто, мы с субботним функциональным пьянством определились.
2 мая, в 19.00. Место — William Bass. Лиговский 53, напротив Галереи. м. площадь Восстания
Всем желающим — быть
qnikst
programming fp theory пока на жуйке не запилили рекомендации комментариев с добавлением своего будет так:

!#2777382/2
трейт-ориентированная система типов.
ну и я пошёл пирса перечитывать, т.к. я что-то явно упустил
qrilka
? fp люди, а чо правда чтоли хвостово-рекурсивные функции они более readable чем более прожорливые аналоги без параметра аккумулятора?
zxc-by
Erlang Haskell fp когда функциональщик достигает успеха, у остальных пердаки нагревают комнату и компьютер выключается от перегрева, от чего вычисление факториала сбрасывается
bitfield
code fp Swift
5> [1,2,3].map { $1 * 10 }
<repl>:5:9: error: type '(($T7, ($T7, $T8) -> ($T7, $T8) -> $T6) -> ($T7, ($T7, $T8) -> $T6) -> $T6, (($T7, $T8) -> ($T7, $T8) -> $T6, $T8) -> (($T7, $T8) -> $T6, $T8) -> $T6)' does not conform to protocol 'IntegerLiteralConvertible'

6> let x = [1,2,3]
x: [Int] = 3 values {
  [0] = 1
  [1] = 2
  [2] = 3
}

7> x.map { $1 * 10 }
<REPL>:8:7: error: 'Int' is not a subtype of '(($T5, ($T5, $T6) -> ($T5, $T6) -> $T4) -> ($T5, ($T5, $T6) -> $T4) -> $T4, (($T5, $T6) -> ($T5, $T6) -> $T4, $T6) -> (($T5, $T6) -> $T4, $T6) -> $T4)'
x.map { $1 }

и эти люди ругают С++ за сообщения об ошибках...
inb4, правильный код --  x.map { $0 * 10 }
bitfield
Apple fp Swift От второтега у большинства наших Мак-девов бугурт разной степени тяжести, а мне нра.
Интересно, будут ли манатки и всякие >>=, <*>, <$>, благо можно определять собственные операторы.
LordFenring
fp хаброта habrahabr.ru
меня вот нифига не функциональщина кормит, но на 8 пункте я себя чуть фейспалмом не убил.
Как в старом анекдоте "Все понятно, барин, а куда лошадь-то запрягать?"
4DA
programming LOL shit fp types "Сама философия статической типизации, что программа — это окаменевший кусок говна, с полностью зафиксированными относительно друг друга, ригидными частями, дефективна и показывает однобокость мышления аутистов-полудурков, живущих на гранты и разрабатывающих теории типов. "
" Сам процесс взаимодействия с компилятором статического языка имеет зачастую необратимый эффект на психику человека. Этот эффект похож на последствия длительного сабмиссивного общения с авторитарным и жестоким человеком. Любой человек, писавший много лет на статическом языке приходит в ужас от взаимодействия с динамическим языком. "
lovesan
programming life fp чят например Курсы по функциональному программированию в элитном чятике

[2:34:31] Dmitry Ignatiev: Ну вот захотел ты посрать. Допустим ты ищешь с какого входа зайти в макдональдс, и к какому туалету
[2:35:01] Dmitry Ignatiev: Тут очередь, там очередь, а в середине еще столики стоят
[2:35:15] Dmitry Ignatiev: Надо изъебнуться и побыстрее пройти, а то уже совсем тянет
[2:39:33] Dmitry Ignatiev: Короче смотри
[2:40:22] Dmitry Ignatiev: Столики стоят и занимают свободное пространство. Между ними тоже есть проходы. На самом деле очереди — в кассу за бигмаками
[2:41:02] Dmitry Ignatiev: Оценивая скорость движения очередей, и количество жирных мудаков в очереди, ты можешь вычислить время стояния в каждом промежутке зала
[2:42:17] Dmitry Ignatiev: Предположим что императивно мыслить ты не можешь, т.к. учился в MIT и на курсе 6.001 все месяцы когда объясняли абстракцию данных — ты пробухал
[2:42:54] Dmitry Ignatiev: Надо рекурсивно вычислить, как бы быстрее пробежать посрать
[2:43:10] Dmitry Ignatiev: Сначала надо найти базу рекурсии
[2:44:06] Dmitry Ignatiev: Для вычисления времени до толчка мы должны рекурсивно поделить задачу об общем времени до толчка к мелким задачам о промежутках времени в каждом проходе
[2:44:49] Dmitry Ignatiev: Можно пропустить слово рекурсивно
[2:45:05] Dmitry Ignatiev: Потому что ты же бухал на 6.001 вместо лекций об императивщине
[2:45:20] Dmitry Ignatiev: Так вот
[2:45:32] Dmitry Ignatiev: Гггг
[2:45:52] Dmitry Ignatiev: Короче, надо сначала найти время на проход каждого мелкого участка пути
[2:45:55] Dmitry Ignatiev: до толчка
[2:46:07] Dmitry Ignatiev: Постепенно вычисляя как бы так пробраться побыстрее
[2:46:33] Dmitry Ignatiev: Сразу вычислить нельзя, потому что задача NP-полна и воще люди загораживают видимость следующих проходов
[2:46:53] Dmitry Ignatiev: Так вот, мы думаем — а как бы так побыстрее пробраться до толчка, это общая задача
[2:47:24] Dmitry Ignatiev: Чтобы побыстрее добраться до толчка — надо сначала побыстрее пробраться на чекпойнт до ближайшего до толчка угла
[2:47:44] Dmitry Ignatiev: А чтобы пробраться до него, надо сначала пробраться на ближайший к нему чекпойнт
[2:47:57] Dmitry Ignatiev: Таким образом получаем рекурсивную функцию, это так в MIT называют
[2:48:05] Dmitry Ignatiev: такой ход вычислений
[2:48:28] Dmitry Ignatiev: Ну так типа принято у пацанов
[2:48:36] Dmitry Ignatiev: Не совсем но близко
[2:48:51] Dmitry Ignatiev: Рекурсивная функция выражается через саму себя, это ваще пацаны в математике придумали
[2:49:10] Dmitry Ignatiev: но вычисляя подобным образом мы в итоге придем ко входу в макдак
[2:49:21] Dmitry Ignatiev: Дальше вычислять смысла тупо нет, потому что мы и так у входа
[2:49:27] Dmitry Ignatiev: Это типа называется базис рекурсии

продолжение в /1
13oz
? sicp fp Что лучше использовать для выполнения упражнений из SICP? Scheme, которая используется в книге, но трудно гуглится (допускаю, что гугл кривой) или racket/haskell/anything else? Именно в плане понимания концепций.
shaggie
Haskell fp мои экзерцисы на тему аппликативных функторов: twitter.com
ИЧСХ в голове сразу решение сложилось, а записать потребовало определённых усилий.
Вот нафига только мне это, буду применять на проекте (в джава коде, ага) — коллеги забьют ногами насмерть.
Или уже найти такую упоротую работу, где оно бы пригождалось...
dmfd
programming fp atp Хочу на летних каникулах познакомиться с зависимыми типами и ATP. Я не математик, поэтому просто на побаловаться. Никаких знаний о возможностях пруверов у меня сейчас нет. Насколько они применимы, например, к таким прикладным разделам математики, как линейная алгебра, теория групп и т.п? Есть ли какие-то "библиотеки" для этого дела?
И что выбрать: Idris, Agda, Coq?
scame
мысли совет fp OCaml жуйк, ты конечно скучный и я на тебя забил, но так же я знаю, что гиков и нердов в тебе достаточно. А вопрос такой. Так сложилось, что мне пришлось поменять парадигму программирования. И вот месяц я уже пишу код на очень крутом языке, ocaml. Пришлось поменять довольно резко, я к этому не готовился, но, вроде бы все получилось. Но теперь я хочу познать истину. А сделать я это хочу, помимо всего прочего, почитав немного интересных книжек по ФП. Соответственно, какие ты посоветуешь? Мне не интересны книги по синтаксису ocaml, а вот по философии и прочем, прочем, с удовольствием. sicp можно не советовать, он для университетского уровня. В общем-то, я не гуглил, просто подумал, что тут могут найтись фанатики и посоветовать мне годноту. Всех благодарю заочно. И за рекоменд буду признателен.
qrilka
? fp а вот насколько реальна идея замутить краудфандинг на выкуп прав на перевод книжки Окасаки? Наверное "крауд" будет слишком маленький? Правда не знаю сколько эти права могут стоить.