avshap: (Default)
avshap ([personal profile] avshap) wrote2008-01-18 12:04 pm

Про срачЪ в SF&F.FANDOM

Повторюсь. Функциональное программирование оно может быть и православненько математичненко, но ебануто на голову ещё больше чем МЭК61131-3 и релейные диаграммы.

[identity profile] khathi.livejournal.com 2008-01-18 09:50 am (UTC)(link)
А теперь поясни мне, чем

(map a (lambda (element)(* element element)))


ебанутее

int i, a[20];
for{i=0;i<20;i++){
  a[i]=a[i]^2;
};
?

[identity profile] avshap.livejournal.com 2008-01-18 10:14 am (UTC)(link)
Тем, что во втором случае понятно сразу: берём массив из 20 элементов и возводим каждый из них в квадрат. А что касается первого - то это какое-то (ворона (сыр (кар(кар(кар())))))

[identity profile] khathi.livejournal.com 2008-01-18 10:27 am (UTC)(link)
Банальный проход функцией λx.x^2 (возведением в квадрат, короче) по списку a. Причём нас при этом совершенно не беспокоит ни выход за границы массива (список может быть хоть бесконечным), ни типы элементов списка (возведутся в квадрат числа любого типа), ни побочные эффекты -- в результате мы получаем новый список, состоящий из квадратов.

[identity profile] oal.livejournal.com 2008-01-18 03:04 pm (UTC)(link)
My other car is cdr.

[identity profile] oal.livejournal.com 2008-01-18 03:04 pm (UTC)(link)
Не слушай скобочко-фага, оно еще непонятнее простому инжинеру-электронщику из-за префиксной нотации. ;)

Как говорит мой шеф, есть два типа компьютерщиков. Одни оперируют битами и байтами, вторые — всякими абстракциями.

Но во втором подноде нет ничего сложного. Вот как оно выглядит чуть в другом синтаксисе:

squareArray array = map (square) array
where square x = x*x

Ну или

squareArray array = map (\x -> x*x) array

А теперь бы делаем point-free, но это уже чуточку более сильное колдунство:

squareArray = map (\x -> x*x)

Ну и что тут сложного? ;)

Вообще-то то, что мы тут назвали array, это такой список. Или не список. А дерево. Или действительно массив. Но это в данном случае роли не играет.

[identity profile] khathi.livejournal.com 2008-01-18 03:20 pm (UTC)(link)
Ты ещё скажи, что Хаскель проще Лиспа. ;)

[identity profile] oal.livejournal.com 2008-01-18 05:42 pm (UTC)(link)
В этих аспектах синтаксиса — проще. Портят все монады. :)

Или ты хочешь холивор? Тогда я щаз сделаю поцт в другом месте, там и посмотрим. :)

[identity profile] khathi.livejournal.com 2008-01-18 05:45 pm (UTC)(link)
Зато в хаскеле нет лисповских макросов, поскольку нет С-выражений. ;)

[identity profile] oal.livejournal.com 2008-01-18 05:59 pm (UTC)(link)
Давай переползем сюда.

[identity profile] khathi.livejournal.com 2008-01-18 06:08 pm (UTC)(link)
Ну, можно, но это уж как хозяин решит.

[identity profile] khathi.livejournal.com 2008-01-18 03:24 pm (UTC)(link)
Кстати, point-free-вариант как раз требует понимания лямбда-исчисления чуть более, чем наполовину, и потому таки более "математичен". ;)

[identity profile] oal.livejournal.com 2008-01-18 05:45 pm (UTC)(link)
Для point-free достаточно для начала понимания «одинаковые параметры с двух сторон мы опускаем». То, что это у нас получается комбинирование комбинаторов и прочие извращения с приведением к point-free — это уже потом.

Лямбда же в том объеме, чтобы врубиться в «"\x -> x*x" это тоже самое, что "square x = x*x", только без "square"» — это всего-навсего концепция анонимной функции. Без всяких гвоздей вроде бета-редукции. :)

[identity profile] khathi.livejournal.com 2008-01-18 05:49 pm (UTC)(link)
Бета-редукция -- это вообще основа основ, таблица умножения, так сказать. Те же Абельсон и Сассман её дают во второй же лекции вообще не называя её никак, под личиной "методов применения функций". ;)

[identity profile] oal.livejournal.com 2008-01-18 05:59 pm (UTC)(link)
Гы. Я лох.