Со мной щас случилось неожиданное. Т.к. я на Хаскелях и Скалах так никогда и не писал ничего длиннее пятка строк, то меня, как и большинство остальных людей несколько смущало понятие "монада". Хотя и знал уже, что по сути это всего лишь умное название для некоего враппера. Но всегда оставалось ощущение, что там есть какой-то более сложный нюанс, т.к. про всякие джавовые 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)`
OBJECT->FUNCTION
OBJECT->PROCESS
#philosophy #oop #fp #logic #cs #programming #science #moq #brahman #parabrahman #supra #ultimate #ultimateartifact #artifact #metaphilosophy #java
habrahabr.ru <https://habrahabr.ru/post/303984/?utm_source=habrahabr&utm_medium=rss&utm_campaign=hub>
на хабре открыт сезон гонений на фп 2 мая, в 19.00. Место — William Bass. Лиговский 53, напротив Галереи. м. площадь Восстания
Всем желающим — быть
!#2777382/2
трейт-ориентированная система типов.
ну и я пошёл пирса перечитывать, т.к. я что-то явно упустил
youtube.com баба норм, доклад ниачём
*girl мнение coding об докладе 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 }
Интересно, будут ли манатки и всякие >>=, <*>, <$>, благо можно определять собственные операторы.
@wm 30 Dec 2009
i love functional programming. it takes smart people who would otherwise be competing with me and turns them into unemployable crazies
i love functional programming. it takes smart people who would otherwise be competing with me and turns them into unemployable crazies
habrahabr.ru
меня вот нифига не функциональщина кормит, но на 8 пункте я себя чуть фейспалмом не убил.
Как в старом анекдоте "Все понятно, барин, а куда лошадь-то запрягать?"
меня вот нифига не функциональщина кормит, но на 8 пункте я себя чуть фейспалмом не убил.
Как в старом анекдоте "Все понятно, барин, а куда лошадь-то запрягать?"
" Сам процесс взаимодействия с компилятором статического языка имеет зачастую необратимый эффект на психику человека. Этот эффект похож на последствия длительного сабмиссивного общения с авторитарным и жестоким человеком. Любой человек, писавший много лет на статическом языке приходит в ужас от взаимодействия с динамическим языком. "
[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
cs.uoregon.edu а я ещё 2012 толком не начал смотреть (хотя вроде темы повторяются местами)
OPLSS 2013 доступен онлайн —
twitter.com
ИЧСХ в голове сразу решение сложилось, а записать потребовало определённых усилий.
Вот нафига только мне это, буду применять на проекте (в джава коде, ага) — коллеги забьют ногами насмерть.
Или уже найти такую упоротую работу, где оно бы пригождалось...
мои экзерцисы на тему аппликативных функторов: ИЧСХ в голове сразу решение сложилось, а записать потребовало определённых усилий.
Вот нафига только мне это, буду применять на проекте (в джава коде, ага) — коллеги забьют ногами насмерть.
Или уже найти такую упоротую работу, где оно бы пригождалось...
fpcomplete.com — The world's first commercial Haskell IDE and deployment platform
И что выбрать: Idris, Agda, Coq?
fsharpforfunandprofit.com
Трололо в адрес Java и прочих C#. Так жирно, что еле монитор оттер
Трололо в адрес Java и прочих C#. Так жирно, что еле монитор оттер