Предикатная логика, функциональное программирование, Скала

Аватара пользователя
Гость

Предикатная логика, функциональное программирование, Скала

Сообщение Гость »

Открыл для себя Скалу, функциональное программирование и предикатную логику. Это же просто офигенно, это как раз то, как должен выглядеть идеальный говно-код для бизнесс-логики: не гонять там что-то из одного списка в другой и делать хуеву тучу проверок, а делать логические квантативные утверждения так, как мы их и понимаем. Кто что думает по поводу сабжа, сделает Оракл такое когда-нибудь в яве? Или функциональное программирование - это зло, все давно это поняли, забыли как страшный сон и договорились даже слова такого в приличном обществе больше не употреблять? Я в отрасли не так давно, мож чего не знаю.

Так же интересно, кто что думает по поводу Скалы? Есть смысл инвестировать время, или это так, для фриков и извращенцев, вопрос времени, когда помрёт?
Аватара пользователя
Гость

Re: Предикатная логика, функциональное программирование, Ска

Сообщение Гость »

я тут ругался на днях,
но скажу что попробовать функциональное программирование обязательно стоит.
Код, который сейчас пишу на Хаскеле, выходит не очень быстро, но получается очень наглядным и интуитивно простым; как правило работает сходу, содержит мало логических ошибок.
Аватара пользователя
Гость

Re: Предикатная логика, функциональное программирование, Ска

Сообщение Гость »

народ, тут же все не первый раз замужем и давно поняли - серебрянных пуль не существует.
может есть область где это функциональное программирование дает охуе...е преимущества и области где ну его нах?

кстати а функциональное программирование на питоне - такое есть?

ну и да, согласен что иногда бизнес логика бывает такая что не лезет в процедурный язык. мне пару раз хотелось что то вроде finite state machine сделать и вынести эти все переходы в табличку. может для каких то особых случаев и ФП хорошо...
Аватара пользователя
Гость

Re: Предикатная логика, функциональное программирование, Ска

Сообщение Гость »

ФП хорошо имхо тем прежде всего, что своей сутью дисциплинирует девелопера, а еще концентрирует идею, не давая ей растекаться в деталях по странице.

Понятно, что всё реализованое через ФП можно делать и "обычными" средствами... Но роль правильно выбранного инструмента немаловажна. Можно и гвозди микроскопом забивать, и классы с объектами на структурном Паскале или даже Бейсике выписывать.

Бизнес-логика - хороший пример. помню как писал выборку из таблиц, мудреную переработку с добавлением данных,.. а потом возвращался из отпуска и не понимал, в каком бреду я это создавал. ФП бы здорово пригодилось тогда.
Аватара пользователя
Гость

Re: Предикатная логика, функциональное программирование, Ска

Сообщение Гость »

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

Простой пример: я хочу написать функцию, которая проверяет, есть ли в данной матрице столбец, в котором все елементы равны нулю. Как я сейчас решу эту задачу? Сделаю, наверное, две функции: одна будет проверять, все ли елементы равны нулю, другая - итерировать:

Код: Выделить всё

	private boolean hasZeroRow(List<List<Integer>> matrix) {
		for (List<Integer> row : matrix) {
			if (isZeroRow(row)) {
				return true;
			}
		}

		return false;
	}

	private boolean isZeroRow(List<Integer> row) {
		for (int elem : row) {
			if (elem != 0) {
				return false;
			}
		}
		
		return true;
	}
Можно в одной все сделать, но тогда нужно будет дополнительные переменные вводить, или метки какие-то ставить. Вариантов не так много. Но самое главное: можно глядя на этот говно-код сразу понять, что он делает? Допустим прошло неск. лет и название функции уже никому ничего не говорит, кто-нибудь сможет сказать, какая идея в этом коде реализована? Нужно будет наверное посидеть, подумать хорошенько. И это я простой пример ещё привёл, у меня тут тонны столетней давности говно-кода, к которому и концепт уже забросили писать, т.к. больше 300 страниц формул и кейсов было. Код - это ацкий пиздец просто, каждый, кто начинал с ним работать переживал как минимум 2-3 личностных кризиса.

Как эту же задачу можно решить, имея возможность передавать кусок кода, как аргумент? Нужно взять, и эту же задачу сформулировать с помощью кода:

Код: Выделить всё

	private <T> boolean existsIn(List<? extends T> elems, {T => boolean} suchThat) {
		for (T theElem : elems) {
			if (suchThat(theElem)) {
				return true;
			}
		}

		return false;
	}

	private <T, R> boolean forAllElements(List<? extends T> elems, {List<T> => boolean} isTrue) {
		return !exists(elems, !isTrue(elems));
	}

	private boolean hasZeroRow(List<List<Integer>> matrix) {
		return existsIn(matrix, theRow => {
			forAllElements(theRow, theElem => {
				return theElem == 0;
			});
		});
	}
Куда ж ведь понятней, правда?
Exists in the matrix a row such that {
for all elements of the row is true {
the element is equals 0
}
}
Вот что мне понравилось, можно человеческим языком выражаться: множество - квантор - предикат.

Я пытался такой же цели достичь обыкновенными средствами - не осилил. Kак ни крути: либо выходит код, который не соответсвует этому мустеру, либо абсолютно нечитабельный код. Или тут дело не в ФП, может это просто пример удачный (взят из книжки по скале)?
Аватара пользователя
Гость

Re: Предикатная логика, функциональное программирование, Ска

Сообщение Гость »

Ну бля, я когда вспоминаю, какой код я писал для работы, часто порываюсь сделать себе харакири...

<code>
>можно глядя на этот говно-код сразу понять, что он делает?
Думаю, можно (не сразу), но как и везде, нужны
"говорящие", т.е. выразительные идентификаторы, комментарии и конечно опыт программирования (т.е. читая код, ты уже сам представляешь как такая задача решается и отвечает ли код этим твоим представлениям)

<code>
>Куда ж ведь понятней, правда?
Не сразу, тут нужен опыт ФП у читающего.
Хотя соглашусь, что выразительности в этом коде больше. Сам язык еще (это Java или C#?) весьма громоздкий.

Вообще, такого плана задачи (матрицы, списки) отлично годятся для ФП.
Но иногда, как и человеку, легче сказать - положи! "это"! "сюда"!, а не намекать издалека - "смотри, когда "это" лежит здесь, то плохо, а когда там, то хорошо!";)


а вообще, ебать мы дОжили,где-то на задворках айти форума основы программирования обсуждаем...
Аватара пользователя
Гость

Re: Предикатная логика, функциональное программирование, Ска

Сообщение Гость »

Это предпологаемая ява 8 (с клазурами) и куча моих опечаток :oops:

Вот так должен выглядеть второй вариант:

Код: Выделить всё

	private boolean exists(List<Integer> list, {Ineger => boolean} block) {
		for (Integer elem : list) {
			if (block(elem)) {
				return true;
			}
		}

		return false;
	}

	private boolean forall(List<Integer> list, {List<Integer> => boolean} block) {
		return !exists(list, !block(list));
	}

	private boolean hasZeroRow(List<List<Integer>> matrix) {
		return exists(matrix, row => {
			forall(row, elem => {
				return elem == 0;
			});
		});
	}
"{Ineger => boolean} block" и "{List<Integer> => boolean} block" - это аргументы специального типа, куда передаётся не значение, а блок кода, который что-то получает (в данном случае Ineger и List<Integer>) и что-то возвращает (boolean и boolean)
"row => {...}" и "elem => {...}" в последней функции - передаваемый код
Аватара пользователя
Гость

Re: Предикатная логика, функциональное программирование, Ска

Сообщение Гость »

В книге кстати первая функция ещё жёще реализована, ещё строже:

Код: Выделить всё

	private boolean exists(List<Integer> list, {Ineger => boolean} block) {
		int i = 0;
		for (Integer elem : list) {
			if (!block(elem)) {
				i ++;
			}
		}

		return i < list.size();
	}
Т.е. вообще никаких ветвлений. Абсолютно противоположный подход, по-моему в этом что-то есть.
Аватара пользователя
Гость

Re: Предикатная логика, функциональное программирование, Ска

Сообщение Гость »

ок похоже на функциональные языки

но в принципе указатель на функцию и в Сях и в Паскале кажется можно было передавать. Просто этим мало кто пользовался.

А вообще похоже на натяжку старой концепции программирования (ООП) к новым реалиям (ФП). Так же, как и когда-то в C++, в императивный язык ввели элементы ООП... все эти полурешения не ахти как хороши.

Но видать тенденция в сторону ФП есть.
Ответить