LINUX.ORG.RU

Третий номер журнала «Практика функционального программирования»

 , ,


0

0

Вышел третий номер журнала «Практика функционального программирования». В новом номере опубликованы следующие статьи:

  1. Рекурсия + мемоизация = динамическое программирование. Дмитрий Астапов.
  2. Проектирование Erlang-клиента к memcached. Лев Валкин.
  3. Как построить Google Wave из Erlang и Tcl при помощи OCaml. Дмитрий Астапов, Алексей Щепин.
  4. Полиморфизм в языке Haskell. Роман Душкин.
  5. Элементы функциональных языков. Евгений Кирпичёв.

Кроме того, журнал организует конкурс на лучшие решения нескольких задач, с денежными (и не только) призами. Язык реализации — любой.

>>> Анонс нового номера журнала

★★★★★

Проверено: maxcom ()
Последнее исправление: maxcom (всего исправлений: 2)

Ответ на: комментарий от Bioreactor

> «Всё есть объект» (с) Алан Кей.

Ты на вопрос о годах рождения ФП и ООП ответь. То, что Алан Кей - пророк, я уже понял.

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

Не, ну почему же сферическом? Конечно же, на С / С++! :) (Да, я видел, что там понапейсывали в викибуках)

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

> То, что Алан Кей - пророк, я уже понял.

Ну надо же! Теперь у нас на ЛОРе есть не только имя Б-га, но и имя Пророка!

Еще раз

ФП == 1958

ООП (как зарождающаяся парадигма) == 1963 ... 1967

100% ООП == 1969 ... 1980

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

А у вас всё, что имеет в имени слово «класс», автоматически является классом?

зачем же так всё утрировать-то?

как приведённый подход противоречит определению, скажите?

Класс — это тип, описывающий устройство объектов. Понятие «класс» подразумевает некоторое поведение и способ представления. Понятие «объект» подразумевает нечто, что обладает определённым поведением и способом представления. Говорят, что объект — это экземпляр класса. Класс можно сравнить с чертежом, согласно которому создаются объекты. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области.

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

> ФП == 1958

ООП (как зарождающаяся парадигма) == 1963 ... 1967

Вот только непонятно, почему ФП не помечено как «зарождающаяся парадигма».

tailgunner ★★★★★
()

Подглядеть решение второй задачи можно в taskjuggler 2 (C++) или taskjuggler iii (ruby) и наверное в faces (python).

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

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

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

Блаблабла. В Javascript объект может иметь как поведение, так и поля, никакого отношения к другим объектам, равно как и к тому, как он был создан, не имеющие.

>>> function MyClass() {this.a = 1}
>>> MyInstance = new MyClass
Object a=1
>>> MyInstance2 = new MyClass
Object a=1
>>> MyInstance.b = "xxx"
"xxx"
>>> MyInstance2.c = function() {console.log("bla-bla-bla")}
function()
>>> MyInstance.b
"xxx"
>>> MyInstance.c()
TypeError: MyInstance.c is not a function
>>> MyInstance2.c()
bla-bla-bla
>>> MyInstance2.b
>>> typeof(MyInstance.b)
"string"
>>> typeof(MyInstance2.b)
"undefined"

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

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

Что значит «тащит»? Если в языке нет соответствующего механизма то его туда не втащить иначе как через изменения самого языка. Здесь расширения языка не происходит. В связи с вышесказанным я склонен заключить что Вы притягиваете факты за уши пытаясь оправдать собственную позицию по ООП. Со всем уважением. :)

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

Блаблабла.

в эту игру можно играть вдвоём: блаблаблабла :)

В Javascript объект может иметь как поведение, так и поля, никакого отношения к другим объектам, равно как и к тому, как он был создан, не имеющие.

и о чём это говорит нам? о том что в javascript, помимо классической, есть и другая модель ООП, больше ни о чём. :)

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

Если в языке нет соответствующего механизма то его туда не втащить иначе как через изменения самого языка.

Или можно его СДЕЛАТЬ в рамках языка. Как, скажем, Олег сделал ООП в Хаскеле, не меняя язык.

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

> Если в языке нет соответствующего механизма то его туда не втащить иначе как через изменения самого языка.

Или можно его СДЕЛАТЬ в рамках языка.

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

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

>и о чём это говорит нам? о том что в javascript, помимо классической, есть и другая модель ООП, больше ни о чём. :)

Это говорит нам о том, что в js прототипная модель ООП, не более. И никакой другой «классической» там нет.

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

Тогда давайте называть Хаскель объектным, а C++ - функциональным (там же есть Boost).

это было бы глупо :)

Хаскель поддерживает объектную парадигму, а в С++ есть stl в котором есть элементы функционального стиля... не вижу в чём проблема

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

Изначальная проблема - в том, что javascript-овские объекты «экземплярами классов» не являются. А что там где можно сэмулировать и насколько хорошо - вопрос десятый.

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

Это говорит нам о том, что в js прототипная модель ООП, не более.

никто и не спорит с этим

И никакой другой «классической» там нет.

есть, Вам приводили не один и не два примера, но Вы смотрите только на те аргументы которые подтверждают Вашу позицию... плохо для кармы

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

есть, Вам приводили не один и не два примера, но Вы смотрите только на те аргументы которые подтверждают Вашу позицию... плохо для кармы

То есть, вы утверждаете, что в JS как минимум две модели ООП? Может быть, вы приведёте какой-либо способ визуально отличить одну от другой?

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

вы утверждаете, что в JS как минимум две модели ООП? Может быть, вы приведёте какой-либо способ визуально отличить одну от другой?

я не совсем корректно выразился... в js существует способ создавать объекты на основе классов, что и было Вам примерами показано :)

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

>> ух ты, это ж практически Пролог.

Никакого отношения не имеет.

Имеет. Первая версия Erlang была написана на Prolog и язык реализации оставил отпечаток в дизайне. Например в синтаксисе: "." как конец выражения. И в семантике: X = ... может выполняться если X уже создан - в этом случае будет проверка на равенство.

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

> от только непонятно, почему ФП не помечено как «зарождающаяся парадигма».

Потому как «Appeared in    1958» (с), «Originally specified in 1958» (с)

«Smalltalk stable release 1980» (c)

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

Первая версия Erlang была написана на Prolog и язык реализации оставил отпечаток в дизайне.

В синтаксисе. И только.

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

>>>> есть, Вам приводили не один и не два примера, но Вы смотрите только на те аргументы которые подтверждают Вашу позицию... плохо для кармы

То есть, вы утверждаете, что в JS как минимум две модели ООП? Может быть, вы приведёте какой-либо способ визуально отличить одну от другой?

Читайте внимательно

Cпасибо, я таки знаю, что такое прототипное ООП.

АПВС?

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

АПВС?

Хочу узнать, как, по мнению shty, разделяются в js два варианта ООП (если, как он утверждал, их там таки не один).

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

в js существует способ создавать объекты на основе классов, что и было Вам примерами показано :)

Не было. От того, что функцию назвали MyClass, она классом не становится.

Miguel ★★★★★
()

В статье «Элементы функциональных языков» допущена ошибка. Автор пишет: «большинство графических библиотек ограничивают возможные преобразования изображений аффинными, поскольку они допускают чрезвычайно эффективное в реализации и удобное для манипуляций матричное представление.» Перспективное преобразование не является в общем случае аффинным но описывается матрицами, поэтому делать тождество между аффинным преобразованием и матричным представлением некорректно.

A-234 ★★★★★
()

ЗЫ Еще один ляп, тамже: «Такой подход общепринят в языках, не реализующих замыкания (см. 4), в т.ч. в Си, Pascal и т. п.»

В паскале замыкания есть, называются вложенными процедурами.

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

и можно например захватить значение строки или массива, которые определены в охватывающем коде? я просто не упомню такого...

ott ★★★★★
() автор топика
Ответ на: комментарий от A-234

там есть авторизация по openid

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

>и можно например захватить значение строки или массива, которые определены в охватывающем коде? я просто не упомню такого...

Да, разумеется. Вообще вложенные процедуры идеальны при рекурсии, я был неприятно удивлен насколько приходилось либо извращаться либо впустую тратить стек при написании рекурсии на С из за отстутствия вложенных процедур. Впрочем вероятно что я не совсем понимаю термин «замыкания».

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

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

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

Другими словами, необходимо чтобы с одной стороны вложенная процедура имела доступ к внешним переменным, а с другой стороны для нее делалась копия этих переменных, так чтобы любые их изменения происходили локально, я правильно понял?

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

В паскале нет замыканий, а вложенные функции являются обычными функциями, имеющими доступ к локальным переменным внешней функции. Если передать эту функцию (на самом деле передаётся только адрес) куда-либо, она не будет вести себя должным образом.

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

Как и в Фортран-90, согласно стандарту. Делать замыкания там запрещено.

Самое смешное, что это (замыкания) сработало под ifort на i386. Я долго думал, что так и надо, пока та же программа, будучи скомпилирована тем же ifort, но под amd64, вылетела в этом самом месте.

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

>> только непонятно, почему ФП не помечено как «зарождающаяся парадигма».

Потому как «Appeared in    1958» (с), «Originally specified in 1958» (с)

«Smalltalk stable release 1980» (c)

Хорошая тактика. Вроде и ответил, а то, что не по теме - никто и не догадается. У Absurd научился?

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

В паскале замыкания есть, называются вложенными процедурами.

Э-м-м... Это половинчатые замыкания - они существуют только пока выполняется создавшая их процедура.

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

в js существует способ создавать объекты на основе классов, что и было Вам примерами показано :)

Не было. От того, что функцию назвали MyClass, она классом не становится.

ну во-первых, вот то что Вы так и не прочитали:

While classes define the type of data and functionality that objects will have, instances are «usable» objects based on the patterns of a particular class.

так понятнее с прототипами?

а во-вторых Вы путаете синтаксис и смысловое наполнение

function Foo()
{
    this.x = 1;
    this.y = 2;
}
 
obj = new Foo;

по смыслу Foo - является классом, в части «Класс — это тип, описывающий устройство объектов.», так пойдёт?

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

по смыслу Foo - является классом, в части «Класс — это тип, описывающий устройство объектов.», так пойдёт?

Не пойдёт.

>>> function Foo() { this.x = 1; this.y = 2; } obj = new Foo;
Object x=1 y=2
>>> obj.x
1
>>> delete obj.x
true
>>> delete obj.y
true
>>> obj
Object
Ну и каким боком теперь Foo описывает устройство obj?

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

Ну и каким боком теперь Foo описывает устройство obj?

никаким, Вы нарушили инвариант... в Python тоже так можно сделать, и это при том что ООП там вполне себе традиционное, с классами :) но это ни о чём не говорит

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

ни о чём не говорит кроме гибкости данного конкретного языка

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

Только на момент создания, и только если Foo написана специфическим образом. Потому что, например

>>> function Bar(field,value){this[field]=value}
>>> o = new Bar("a",1)
Object a=1
>>> o2 = new Bar("b","zzz")
Object b=zzz
>>> o3 = new Bar("c",function(){console.log(o.a)})
Object
>>> o3.c()
1
уже очень непохоже на классы. То есть, класс-ориентированность - она не в коде и не в языке, она только в мозгах программиста.

Фактически, Foo описывает объект «на момент создания» в том же смысле, в котором оператор присваивания описывает переменную «на момент выполнения».

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