Pull to refresh
46
0
Дмитрий Слуцкий @Lakret

User

Send message
А как с деньгами? Стипендия, компенсация проживания и прочее?
Переменная, которая не изменяется = значение. В C# нет let, val или каких-то других подобных вещей, но это не значит, что от того, что компилятор не ограничил возможность изменения чего-то, это внезапно стало меняться.

«При каждом вызове метода» будет создана новая переменная (или семантика будет такой же, как при создании новой переменной, для особо придирчивых).

«Значение переменной» не будет определено до того момента, пока не вернётся результат выполнения последнего метода. Опять же, по семантике. Можно почитать про то, как оператор let определяется в простом нетипизированном лямбда-исчислении, или построить AST.

То, что никогда не меняется — это то, что никогда не меняется. «Переменные» в математике тоже никогда не меняются. Стоит различать смысл и форму, не?

Наконец, стоит помнить, что типы, синтаксис и прочее — это синтаксическая категория, и только. Важна семантика.
Это pipelining, а не композиция. Его обычно используют так:
someList 
|> Seq.skip 3
|> Seq.map ((+) 1)
|> Seq.filter ((>) 3)
|> Seq.length

Разницу легко понять, если взглянуть на типы:
> (|>);;
val it : ('a -> ('a -> 'b) -> 'b)
> (>>);;
val it : (('a -> 'b) -> ('b -> 'c) -> 'a -> 'c)

Ну и да, на самом деле версия с композицией не скомпилируется, если дальше мы где-то не используем полученную функцию, из-за value restriction, но это уже совсем другая история...)
Ну, эта запись соответствует принятой в математике:
(f ∘ g)(x) = f(g(x))
=>
(length ∘ (filter (>3)) ∘ (map (+1)) ∘ (skip 3)) x = length((filter (>3))((map (+1))((skip 3)(x))))
Хотя мне больше нравится синтаксис OCaml/F# для этого:
Seq.length << (Seq.filter ((>) 3)) << (Seq.map ((+) 1)) << (Seq.skip 3)
или, эквивалентно:
(Seq.skip 3) >> (Seq.map ((+) 1)) >> (Seq.filter ((>) 3)) >> Seq.length
Меня не особо интересует ЖЖ и его граф :)
Ну, проблема различения следствия и причины вообще характерна для статистики.
Например, я могу выделить сильносвязные компоненты и предположить, что все люди в таких компонентах относятся к определённым социальным группам — а по информации из профайла я могу понять, что именно их объединяет. Или же, можно сравнить аккаунт пользователя с аккаунтами его друзей по отдельным факторам, и таким образом определить, насколько значимыми являются выбранные факторы для данного пользователя при выборе круга общения. Второй пример я на самом деле делал для небольшого графа и был слегка поражён результатами — это правда работает.
Не буду вдаваться в длинную дискуссию, но замечу, что «содержательная интерпретация» таких графов вполне возможна. Для того, чтобы на самом деле получить много актуальной информации из них, впрочем, одного анализа графа недостаточно; но граф может и должен быть использован при таком анализе.
О каких событиях вы сейчас говорите? Я знаю только такие, и я их здесь не вижу.
Использование указателей на функцию — это один из методов реализации ФВП. Сами же функции высшего порядка появились задолго до указателей и компьютеров — вспомните оператор дифференцирования, например.
На этом я прекращаю дискуссию с вами, потому что ваша базовая необразованность делает её заведомо контрпродуктивной.
Потому что здесь уже не только я выражаю сомнения по поводу вашей квалификации.
Пожалуйста, возьмите любой учебник по любому из этих языков и выучите его. И все ваши вопросы отпадут сами собой, уверяю. Вот конкретно вам я рекомендую вот эту книгу, где подробно показано, как ФП и ООП пересекаются и как их использовать вместе.
Вы также можете посмотреть мою статью, которая в неком смысле касается этого. Но это ни в коей мере не заменит вам полноценное изучение предмета, конечно.
Вообще-то F# (которым пользуюсь я) совмещает ООП и ФП, как и Scala, как и OCaml.
Вы можете хоть на один из этих вопросов ответить? Я задал их потому что мне кажется, что вы не знакомы с элементарными основами функционального программирования, и поэтому вы говорите такие, например, глупости:
«Но в язык без переменных — это глупость, это скатывание к более низкоуровневому программированию и ничего больше.»
Вы умеете пользоваться браузером и читать простые английские тексты, я вообще не понимаю этой настойчивости: там везде bullet-points, в чём проблема-то?
В ссылках написано всё по пунктам. Я вам так напомню, что я вам ничего не должен — пора бы уже научиться читать и пользоваться гуглом, ей богу.
С чего это вы решили, что я отказываюсь от ООП? Я умею и люблю использовать все основные парадигмы программирования.
Что такое бета-редукция, о которой вы сейчас так смело рассуждаете, раскажите пожалуйста?
Редуцируйте это выражение, например:
(\x. y) ((\x. x x) (\x. x x))
Имеет ли оно нормальную форму? Какой порядок редукции вы бы использовали, чтобы найти её?
Что такое call-by-value, call-by-need и call-by-name?
Подумайте, насколько вы знакомы с теорией computer science? Может, таки стоит начать учиться?
Why functional programming matters
Читаем раздел benifits of F#
Why functional programming?
Ну, или смотрим как делают асинхронное программирование в функциональном языке и как — в ОО.
Я могу долго продолжать, но поймите: если вы пришли устраивать революцию, то это вы должны аргументировать. Я пока не вижу никаких аргументов кроме «я не знаю, что такое ФП, поэтому оно плохое».

Для некоторых случаев функциональные языки работают медленнее. Тем не менее, смотрите слайд 11.
Тем не менее, любой статически типизированный функциональный язык с лёгкостью обойдёт по производительности среднестатистического кода Perl, PHP или Python с Ruby. Видимо, всем пора прекратить использовать эти языки, судя по вашей логика.
Скажите, вы прочитали информацию хоть по одной из тех ссылок, что я вам кинул?
Сравнение, подстановку и присваивание путают только очень начинающие программисты. Почитайте, что это.
Зачем мне переписывать то, что уже написано сотни раз? Может, лучше вам взять и почитать, наконец, хоть что-то про ФП?
Вот так «низкоуровнево», например, выглядит применение функции высшего порядка fold (которая объявлена без переменных), к списку (который неизменяемая структура данных) с целью сложения его элементов:
List.fold (+) 0 [1..10000]
Да, это такой «низкоуровневый» аналог императивного «высокоуровнего» решения:
let mutable sum = 0
let array = [|1..10000|]
for i in 0..(array.Length - 1) do
sum <- sum + array.[i]

Вы можете считать глупостью, конечно, работы таких учёных, как Рассел, Чёрч или Карри. Уверяю вас, они от этого ничего не потеряют. Как и мы магическим образом не станем писать длинный и загромождённый переинженерингом код, чтобы только инкапсулировать операцию, как в паттернах Command или Strategy, или чтобы создать объёмную и унылую иерархию классов в паттерне State, вместо того, чтобы воспользоваться алгебраическими типами данных и сопоставлением с образцом. Каждому своё: если вы хотите уметь пользоваться только молотком, это ваш выбор.
Пожалуйста, перестаньте. Я сейчас просто от смеха умру, ей богу xDDD В следующий раз потратьте хоть немного времени на изучение того, о чём пишите, хорошо?)
Какое отношение скорость работы имеет к математической состоятельности подхода? Где и когда кто-то говорил, что ФП быстрее другой парадигмы? Как вообще парадигма может быть быстрее? Это нонсенс.
Более того, ни «события ООП», ни LINQ (О___О) никто в здравом уме не будет использовать в алгоритмах машинного обучения. Векторизация и линейная алгебра — наше всё. Можно сказать, что молотком плохо получается жестяные банки открывать, тоже отличный аргумент будет.
У меня нет ни времени, ни желания, ни даже места пересказывать здесь то, что вы можете найти в тех книгах, на которые я вам указал.
Если хотите узнать про то, как ФП используется, и для каких «небольших» классов задач оно подходит, то вот пара ссылок:
Узнаём, откуда ФП есть пошло
Не забываем, что основная его идея — что результат = программа(входные данные).
Узнаём, что делает его очень интересной парадигмой
Узнаём, кто его использует
Узнаём, почему его используют
Узнаём, что такое побочные эффекты и почему в чистых функциональных языках нет переменных, и думаем, как это можно «подчинить» императивным парадигмам.
Узнаём, на какой идее на самом деле основано всё «высокоуровневое» ООП, кроме идей абстракции, которые существуют с начала существования человечества.
Узнаём, что на этом свет не сошёлся
Узнаём, почему математики любят ФП
Ну, и так:
Closure
«Closures can be used to implement object systems.» — обратите внимание
1
23 ...

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Works in
Date of birth
Registered
Activity