LINUX.ORG.RU

[области применения][философия] Функциональная парадигма

 


0

0

Сабж следует применять только если существует фундамент в виде формальной теории. Вот для парсеров, например, такой фундамент есть. Поэтому ФЯ очень хорошо здесь себя показывают. Реляционная алгебра тоже отлично ложиться на функциональную парадигму. И если бы не требования производительности, то СУБД писали бы на функциональных языках. Нейросети те же с каким-нибудь языком для их описания реализовать можно в несколько десятков строчек. А там, где вместо математики какой-то рецепт из кулинарной книги типа взять, покрутить, пукнуть тут, свистнуть здесь и положить вон на ту полку использование ФЯ не нужно и вредно. Вот такое сложилось у меня мнение.

Да, функциональная парадигма невероятно стройна и красива. Я сам испытываю эстетическое наслаждение сравнимое с оргазмом при её применении. Но у всего есть свои области применения.

anonymous

>Да, функциональная парадигма невероятно стройна и красива. Я сам испытываю эстетическое наслаждение сравнимое с оргазмом при её применении.

Вот когда фраза "я кончил этот проект" приобретает особый смысл.

wfrr ★★☆
()
Ответ на: комментарий от anonymous

> Нет. Это не задача программиста.

С чего так сразу ограничивать свободу программиста?

Miguel ★★★★★
()
Ответ на: комментарий от Rastafarra

> зы. ocaml наше все :)

Ну и caml light то же наше ничего так :)

itanko
()

> А там, где вместо математики какой-то ....

Ну например, метод Гаусса -- математики вроде бы много, а на ФП писать всё равно что гланды через жопу выдирать.

Reset ★★★★★
()
Ответ на: комментарий от DonkeyHot

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

Reset ★★★★★
()
Ответ на: комментарий от Reset

>тогда придумывать ничего не придется

Просто мой опыт в ф-ине слишком мал, приходится. Кстати, не так уж это и страшно, думать. И даже слегка приятно. Т.ч. не буду портить удовольствие. У меня получилось порядка 8ми строк, но там ещё пара тонкостей, т.ч. я думаю, получится порядка 10-12.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

> У меня получилось порядка 8ми строк, но там ещё пара тонкостей, т.ч. я думаю, получится порядка 10-12.

Ну так выложи.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Нужно же дать время оппоненту удовольствие получить. Кроме того, проверить нужно, у меня программы редко с первого раза работают. А я только что комп новый собрал, ещё почти ничего не поставлено, проверить не могу. Т.ч. выложу, как работать начнёт.

DonkeyHot ★★★★★
()
Ответ на: комментарий от tailgunner

Вот что получилось:

import Data.List
degauss = diagonize []
diagonize answer [] = reverse answer
diagonize answer (row:rows) = diagonize (this':map row' answer) (map row' rest) 
	where
	((one:this),rest) = mapAccumL maximize row rows
	this' = map (/ one) this
	row' (x:xs) = zipWith (elim x) xs this'
	elim x y t = y - x*t
	maximize a b | head a < head b = (b,a)
 	             | otherwise = (a,b)

DonkeyHot ★★★★★
()
Ответ на: комментарий от Rastafarra

>зы. ocaml наше все :)

А мне вот он не понравился, даже немного разочарован. :(

anonymous
()
Ответ на: комментарий от DonkeyHot

Мда, проще китайский выучить чем осилить это и осознать как оно соотносится с формулами отсюда http://ru.wikipedia.org/wiki/Метод_Гаусса .

Еще и непонятно как это запускать и проверять. Ну там задание матрицы из файла или по формуле, подсчет невязок ...

Reset ★★★★★
()
Ответ на: комментарий от anonymous

Я еще к тому, что если добавить код по чтению файлов, подсчет невязок и т.д. и т.п., то код будет не меньше чем на Си + добавляется нечитаемость. Как это соотносить с классическим описанием алгоритма Гаусса? Где тут a_i_j ? Где тут "для каждого j" ... В этом отношении с кодом на Си проводится четкая параллель, а на Haskell'е получается китайская грамота в которую надо врюхивать.

Reset ★★★★★
()
Ответ на: комментарий от Reset

> Как это соотносить с классическим описанием алгоритма Гаусса?

Формальное описание алгоритма - функциональное. Лучше всего описывается в нотации пришедшей в математику из языка Miranda.

Joe_Bishop
()
Ответ на: комментарий от Reset

>проще китайский выучить

Хотелось бы посмотреть:).

>Если оно работает


Там не хватает реакции на "крайние" случаи (типа 0ли в неудачных местах). Оставим тебе для разминки в перерывах между уроками китайского:)

>подсчет невязок


А это что?

>Где тут a_i_j ? Где тут "для каждого j"


Внутри ф-ии "map", конечно. Действительно, написать a[i][j] короче чем в С довольно трудно. Вопрос в том, _нужно_ли_ это делать каждый раз по новой.

>если добавить код по чтению файлов,


Я что-то не слышал, чтобы Гаусс такой фигнёй занимался. К тому же в данном случае (чтение списка списков чисел) хаскель вполне может оказаться "на коне".

Стоит понять, что ф-щина выигрывает за счёт более мощных методов повторного использования кода. Т.о. на "средней"(в смысле неизвестного содержания) большой задаче _должна_ быть короче, понятней(:для мыслящих соответствующими категориями -- мне, например, то, что я написал тоже не сразу понятно:), и пр. За исключением случаев, когда задача явно требует "необычного" использования "a[i][j]". И то, только если таковое занимает бОльшую долю системы -- иначе выгоднее подключить библиотеку на более соотв. языке.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

Сеточные методы в 99% случаев требуют "необычного использования" a[i][j], поэтому так просто как с Гауссом ты не выкрутишься :)

Reset ★★★★★
()
Ответ на: комментарий от Reset

>Сеточные методы в 99% случаев требуют "необычного использования"

А кто говорил, что ФП "fits all"? Есть куча задач, лучше реализуемых в другом виде, и такая же куча наоборот. Вопрос в том, какой процент "этого" в полной системе -- включая ввод-вывод, грабёж корованов, и прочие свистелки-переделки (2е "е"-умышленное). Конечно, если тебя применяют только для "сеточных методов" -- вряд ли стоит задумываться о большой картине.

А с Гауссом я, пожалуй, таки выкручусь. Т.к. я утверждал, что "писать это - одно удовольствие". Эту фигню действительно было приятно писать (мне пришлось сделать это 2жды, т.ч. я уж знаю) -- редко доводится видеть, как инструмент сам делает всё, что нужно.

DonkeyHot ★★★★★
()
Ответ на: комментарий от Reset

> Мда, проще китайский выучить чем осилить это и осознать как оно соотносится с формулами отсюда

тогда держи для разнообразия метод Гаусса на Форте:

0 : MD1+ cn1 %[ %I DU M@ 1+ %I DU M! %J ;
1 : MD1-  cn1 %[ %I DU M@ 1- %I DU M! %J ;
2 : mc O @ DU M@ 1- DU P ! 0= IF . "КОНЕЦ" QUIT ELSE THEN ;
3 : mp/ O @ G @ M@ P @ / O @ G @ M! ;
4 : mq! L @ O @ M@ Q ! ;
5 : mq mq! cn1 [ L @ I M@ Q @ O @ I M@ * - L @ I M! 
] ;
6 : m5 O @ mc cn1 [ I G ! mp/ ] cn1 ;
7 : m6 L ! L @ O @ ;
8 : MI MD1+ cn1 [ I m5 [ I m6 = IF ELSE mq THEN ] ] 
MD1- ;
9 : V0 %5* DU a0V SW ERASE c38498 %+! ;
10 : aab c38500 mb %+ DU B %! %N@ %5* %+ A %! ;
11 : VBI aab B %@ c38498 %! VI %N@ V0 VA0 ;
12 : m7 M@ * SW A %@ + DU ROT SW @ + SW ! ;
13 : ij 1- C5 * ;
14 : MV* cn1 [ cn1 [ J ij I ij B %@ + @ J I m7 ] ] ;
15 : XSLE VBI MV* A %@ c38498 %! VO ;

anonymous
()
Ответ на: комментарий от anonymous

>А есть язык программирования, понимание которого впитывается с молоком матери?
ЛОГО или русский матерный?

anonymous
()
Ответ на: комментарий от DonkeyHot

>Стоит понять, что ф-щина выигрывает за счёт более мощных методов повторного использования кода. Т.о. на "средней"(в смысле неизвестного содержания) большой задаче _должна_ быть короче, понятней

дык вот ваш функцианальный подход http://www.dzone.com/links/rss/haskell_gt_scala_gt_java_7_ltgt_functional_jav... сравнивается

anonymous
()
Ответ на: комментарий от anonymous

>вот ваш функцианальный подход сравнивается

Это неинтересный метод. Более интересно, например, сравнить xerсes с haxml, или darcs с cvs и т.п. -- на одинаковой "настоящей" задаче.

DonkeyHot ★★★★★
()
Ответ на: комментарий от anonymous

>тогда для полноты картины сравнить Xerces с RapidXML

Как тут принято говорить, "гы".

>Surprisingly, the key to template metaprogramming turns out to be functional programming

DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.