Почему smalltalk не является функциональным языком программирования?

С возрождением интереса к функциональным языкам программирования я заметил некоторое сходство между Smalltalk и FPL, а именно замыкания ( BlockClosures в Smalltalk ). Тем не менее, Smalltalk не является FPL?

Что нужно, чтобы считать его таковым?


person OscarRyz    schedule 20.08.2010    source источник
comment
Потому что Smalltalk — олицетворение объектно-ориентированных языков?   -  person CurtainDog    schedule 20.08.2010
comment
Возможность использовать функции как объекты первого класса делает язык функциональным не больше, чем возможность писать процедуры делает язык процедурным.   -  person Gabe    schedule 20.08.2010
comment
@Gabe: Некоторые утверждают, что одного этого свойства достаточно, чтобы язык имел тег языка функционального программирования.   -  person missingfaktor    schedule 20.08.2010
comment
@CurtainDog: объектно-ориентированный подход и функциональность не являются взаимоисключающими парадигмами.   -  person Frank Shearar    schedule 20.08.2010
comment
@Frank Shearar - Концептуально я бы сказал, что они взаимоисключающие. Что касается кода, то здесь мы имеем дело с полными языками Тьюринга, так что ничто (кроме здравого смысла) не остановит нас от специальной смеси этих двух языков.   -  person CurtainDog    schedule 23.08.2010
comment
@CurtainDog, это хорошая академическая позиция, но на практике это не имеет смысла: я говорю не о статье, которую кто-то написал, я говорю о том, как Smalltalkers на самом деле пишут, что очень важно. функциональным способом, используя предметы. Методы без побочных эффектов, методы/замыкания как первоклассные объекты (объекты, как и Common Lisp, еще один функциональный язык программирования). Неудивительно, учитывая сильное влияние Smalltalk на Lisp.   -  person Frank Shearar    schedule 23.08.2010
comment
@CurtainDog: ››Концептуально я бы сказал, что они взаимоисключающие.‹‹ Нет, это не так. Посмотрите на Scala, где есть огромный контрпример.   -  person missingfaktor    schedule 23.08.2010
comment
@Frank Shearar ›› очень функциональная манера с использованием объектов ‹‹ Боже! Штопать! Когда мы пишем sin() полностью функциональным способом на VisualBasic, делает ли это VisualBasic функциональным языком программирования?   -  person igouy    schedule 23.08.2010
comment
@Missing Faktor - [Scala] плавно интегрирует функции объектно-ориентированных и функциональных языков. Разве это не говорит о том, что Scala разработана как гибрид?   -  person igouy    schedule 23.08.2010
comment
@igouy Ну, если бы было естественно и идиоматично писать на VB в функциональной манере, да, я бы сказал, что это функциональный язык программирования.   -  person Frank Shearar    schedule 23.08.2010
comment
@Frank Shearar - Зачем уклоняться от моего прямого вопроса вместо того, чтобы воспользоваться возможностью найти области согласия и несогласия? Когда ты даже не можешь заставить себя сказать - Нет, наличие функции sin в VB не делает VB FPL - мне кажется, что ты ссоришься ради ссоры.   -  person igouy    schedule 24.08.2010
comment
@igouy, я несколько раз говорил: если язык позволяет вам естественным образом программировать в стиле FP, то в моей книге это FPL. У меня нет опыта программирования на VB, поэтому я не могу комментировать, является ли это FPL или нет. Поддерживает ли он функции более высокого порядка? закрытия? Является ли неизменное состояние нормой или запоздалой мыслью? Но пока мы говорим о прямых ответах: как метод не является функцией? (Моя позиция: это функция. Лямбда, привязанная к символу в словаре методов объекта, а не лямбда, привязанная к символу в таблице символов пакета.)   -  person Frank Shearar    schedule 24.08.2010
comment
@Frank Shearar ›› У меня нет опыта программирования на VB ‹‹ Вы понимаете, что такое функция sin?   -  person igouy    schedule 24.08.2010
comment
@igouy Да, спасибо, я знаю, что такое функция греха. Пожалуйста, сделайте мне одолжение и прочитайте, что я добавил в свой отредактированный ответ. Так что, в ответ, пожалуйста, ответьте на мои вопросы, вместо того, чтобы пытаться превратить мои аргументы в соломенное чучело.   -  person Frank Shearar    schedule 24.08.2010
comment
@Frank Shearar - Так зачем вам нужно что-то знать о VB, прежде чем вы сможете сказать нам, сделает ли возможность написать эту функцию на VB VB функциональным языком программирования? (Похоже, вы не отметили изменения в своем отредактированном ответе.)   -  person igouy    schedule 25.08.2010
comment
@igouy: Изучите историю изменений. Я суммировал аргументы за и против того, чтобы Smalltalk был FPL. Итак, еще раз: почему именованные функции не привязаны к классу настолько важны для FPL, что наличие замыканий, HOF и т. д. не позволяет сделать Smalltalk считается FPL?   -  person Frank Shearar    schedule 25.08.2010
comment
@Frank Shearar ›› почему именованные функции не привязаны к классу, столь важному для FPL ‹‹ Мне любопытно, смотрели ли вы «Синтезирование объектно-ориентированного и функционального дизайна для содействия повторному использованию»?   -  person igouy    schedule 25.08.2010
comment
Случайно наткнулся на следующую ссылку и подумал, что она может оказаться интересной в контексте данного обсуждения: Функциональный Программирование на языке Smalltalk. Удачи.   -  person Bob Jarvis - Reinstate Monica    schedule 03.01.2016


Ответы (9)


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

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

В большинстве случаев Smalltalk может выразить все решения, созданные с использованием парадигмы объектно-ориентированного программирования, но он не может примитивно выразить множество решений, созданных с использованием парадигмы функционального программирования. Вот почему я не считаю это FPL. Несмотря на то, что он не может примитивно выразить каждое решение, которое может FPL, Smalltalk чрезвычайно расширяем, и вы можете расширить его, чтобы иметь возможность выражать все решения, которые может FPL.

person Diego Geffner    schedule 20.08.2010
comment
Можете ли вы назвать несколько примеров вещей FPL, которые Smalltalk не может выразить примитивно? - person Frank Shearar; 22.08.2010
comment
Несмотря на то, что это старая ветка, я не согласен с представленным здесь определением объектно-ориентированного программирования. ОО просто выражает программу в виде сущностей, обменивающихся сообщениями и инкапсулирующих состояние; моделирование проблемной области непосредственно как объекты не входит в определение, а скорее - ИМО - это инструмент или даже уловка. В этом смысле функциональную программу можно рассматривать как сущность, инкапсулирующую нулевое состояние и взаимодействующую с помощью очень простых сообщений (применить). Это сделало бы функциональную модель подмножеством ООП. - person cdegroot; 10.08.2013

Общепринятого определения языка функционального программирования не существует.

Если вы определяете функциональный язык как язык, поддерживающий функции первого класса, тогда да, Smalltalk *является* функциональным языком.

Если вы также принимаете во внимание такие факторы, как поддержка неизменности, алгебраические типы данных, сопоставление с образцом, частичное применение и т. д., то нет, Smalltalk *не* является функциональным языком.


Я рекомендую вам прочитать следующие связанные сообщения в блоге (а также комментарии под ними):

person missingfaktor    schedule 20.08.2010
comment
Действительно, Smalltalk — почти функциональный язык. Существуют расширения для Smalltalk, которые обеспечивают сопоставление функциональных шаблонов, например. map.squeak.org/package/3772b420-ba02-4fbd-ae30- 8eadfc323b7b. Более того, новояз (newspeaklanguage.org) – это язык программирования в традициях Self и Smalltalk, поддерживающий неизменяемость как одну из его основные понятия. - person Lukas Renggli; 20.08.2010
comment
Разве это определение не делает C#, Javascript и почти все языки этого века функциональными? - person Diego Mijelshon; 20.08.2010
comment
@Diego: Как я уже сказал, общепринятого определения термина «язык функционального программирования» не существует. Итак, по первому определению, да. По второму определению нет. - person missingfaktor; 20.08.2010
comment
@Missing Faktor - Предоставляет ли Smalltalk способ объявления именованных функций? - person igouy; 21.08.2010
comment
@igouy: я могу ошибаться, но разве func в этом примере не является именованной функцией? - person missingfaktor; 21.08.2010
comment
@Missing Factor - Какой пример? - person igouy; 22.08.2010
comment
@iguoy: я включил ссылку в свой комментарий. Кажется, StackOverflow его съел. В любом случае, вот он снова: ideone.com/NoB1C - person missingfaktor; 22.08.2010
comment
@iguoy: лучший пример: ideone.com/4NNOv (спасибо @SergeStinckwich в Твиттере). - person missingfaktor; 22.08.2010
comment
@Missing Faktor - поля комментариев не обеспечивают достаточной гибкости, поэтому мой ответ теперь редактируется в моем ответе OscarRyz. - person igouy; 22.08.2010
comment
О частичной оценке: см. blog.3plus4.org/2007/03/ 23/заигрывание в светской беседе - person Frank Shearar; 01.05.2011
comment
Конечно, существует общепринятое определение того, что делает язык программирования функциональным. Являются ли функции гражданами первого сорта? Да или нет? Если да, то это функциональный язык. Так что же это значит (гражданин первого класса)? Можете ли вы вернуть функцию в качестве результата? Можете ли вы назвать функции верхнего уровня? Можно ли передавать функции в качестве аргументов методам или другим функциям? Вы умеете составлять функции? Другими словами, можно ли использовать функции в качестве значений? Если все это так, то язык функционален. Следовательно: Smalltalk не является функциональным языком, так как конструкция верхнего уровня - это КЛАССЫ! - person Angel O'Sphere; 21.09.2011
comment
@AngelO'Sphere, ты ошибаешься на многих уровнях. Как я уже сказал, не существует общепризнанного (или даже общепризнанного) определения термина функциональный язык. То, что вам больше нравится какое-то определение, не делает его стандартным определением. - person missingfaktor; 25.10.2012
comment
@AngelO'Sphere, я хорошо знаком с функциями первого класса. (Scala и Haskell — мои основные языки.) В любом случае спасибо за беспричинное объяснение этого термина. Теперь: классы на верхнем уровне ортогональны функциям первого класса. Scala, Smalltalk и многие другие обладают обеими характеристиками. Или вы теперь собираетесь изменить свое определение, добавив, что оно должно поддерживать определения функций верхнего уровня? - person missingfaktor; 25.10.2012
comment
@missingfactor Я не понимаю, о чем вы спорите. Ваш комментарий начался с этого предложения: Не существует общепринятого определения языка функционального программирования. И я исправил это. Безусловно, это общепринятое определение функциональных языков. Почитайте википедию, например. - person Angel O'Sphere; 14.06.2013

Smalltalk может и не быть «чисто функциональным языком» (что бы это ни было). Однако естественное использование Smalltalk часто приводит к функциональному коду. (Я предполагаю, что люди Scala назвали бы «объектно-функциональным».)

Например, класс Squeak's Point имеет функциональный API: такие методы, как 1@1 translateBy: 1@1, возвращают новые Points с новым состоянием вместо изменения внутреннего состояния. (Это делает Point практически неизменяемым, поскольку единственный способ изменить внутреннее состояние объекта — использовать механизмы отражения, такие как #instVarAt:.)

Вполне нормально использовать в Smalltalk функции более высокого порядка, такие как карты, фильтры, складки и тому подобное. Учитывая, что они встроены в API коллекций, часто проще написать код, который функционально использует коллекции, чем не использовать их.

Так много людей имеют так много определений «функционального языка программирования», что вопрос «является ли Foo FPL» столь же бесполезен, как и вопрос «является ли Foo объектно-ориентированным языком».

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

Согласно этому описанию, Smalltalk является функциональным языком программирования. Он вызывает функции первого порядка «методы» или «блоки» в зависимости от того, являются ли они именованными или анонимными. Объекты хранят состояние в переменных экземпляра. Функции высшего порядка — это просто методы, которые принимают блоки в качестве параметров.

Сказав это, да, вы можете написать Smalltalk нефункциональным способом. Это позволяет изменять состояние. Мешает ли это тому, чтобы Smalltalk называли функциональным языком? Если это так, то эти языки не работают: Common Lisp, Erlang (общее состояние через словарь процесса, ets/dets).

Итак, вкратце, Smalltalk — это FPL, потому что:

  • Функции — это сущности первого класса (объекты, в языке Smalltalk — CompiledMethods или BlockClosures, если быть точным).
  • Smalltalk поддерживает замыкания (он называет их блоками).
  • Smalltalk позволяет функционально писать в естественной идиоматической манере.

и Smalltalk не является FPL, потому что:

  • Вы, как программист, должны гарантировать, что ваши структуры данных (объекты) неизменны (за счет того, что сеттеры/мутаторы возвращают копии объекта с измененным состоянием).
  • Вы, как программист, должны убедиться, что ваши методы (функции) не имеют побочных эффектов.

(Некоторые Smalltalk, по-видимому, поддерживают неизменяемые объекты. Мой опыт ограничен Squeak, который не поддерживает неизменность на уровне VM.)

Изменить: я не понимаю потребности iguy в определениях именованных функций, кроме определения методов для объекта. Но в любом случае, вот:

Smalltalk at: #func put: [:x | x + 1].
func value: 1.
person Frank Shearar    schedule 20.08.2010
comment
›› Smalltalk может и не быть чистым функциональным языком (что бы это ни было) ‹‹ Является ли Smalltalk вообще нечистым функциональным языком? - person igouy; 22.08.2010
comment
В Smalltalk программа организована в виде объектов, но в функциональном языке программирования программа организована в виде функций. Существует хорошо понятное и фундаментальное различие в том, как мы структурируем программы в ООП и ФП. Например, см. Синтез объектно-ориентированного и функционального дизайна для поощрения повторного использования cs.brown.edu/~sk/Publications/Papers/Published/kff-synth-fp-oo - person igouy; 22.08.2010
comment
›› Класс Squeak's Point имеет функциональный API ‹‹ Вы говорите, что поведение обеспечивается доступом к экземплярам класса Point, не определенным в семействе функций. - person igouy; 22.08.2010
comment
@igouy: Организация в объекты не является аргументом против того, что Smalltalk не является функциональным языком. См. Common Lisp (и, в частности, CLOS). Вы говорите объект, а я говорю набор функций, которые работают со структурой одного типа в своем собственном пространстве имен. - person Frank Shearar; 22.08.2010
comment
@iguoy: ›› Класс Squeak's Point имеет функциональный API ‹‹ Вы читали класс? Поведение обеспечивается функциональными методами (т. е. без побочных эффектов, без изменяемого состояния). Он определен в семействе функций, которые мы называем методами. - person Frank Shearar; 22.08.2010
comment
›› Организация в объекты не является аргументом против того, чтобы Smalltalk не был функциональным языком. ‹‹ Smalltalk не организован в функции — это аргумент против того, чтобы Smalltalk был функциональным языком. - person igouy; 23.08.2010
comment
›› Smalltalk по адресу: #func put: [:x | х + 1]. ‹‹ Действительно ли так пишутся программы на языке Smalltalk? Действительно ли так написаны библиотеки Smalltalk? - person igouy; 23.08.2010
comment
Вы читали «Синтезирование объектно-ориентированного и функционального дизайна для повторного использования»? - person igouy; 23.08.2010
comment
Вы читали класс Point? Хотел бы я найти недавно прочитанную статью, в которой Scheme описывается как первый правильный объектно-ориентированный язык, отличный от Simula-67. Да, Схема. Точно так же, как Erlang — это функциональный язык программирования и объектно-ориентированный язык. (Просто спросите Джо Армстронга.) - person Frank Shearar; 23.08.2010
comment
Несколько лет назад у меня была краткая электронная беседа с Джо Армстронгом по поводу его статьи «Почему объектно-ориентированный подход — отстой» — я пытался понять его точку зрения и прояснить то, что казалось мне недопониманием. Почему OO Sucks все еще кешируется Google - webcache.googleusercontent.com/ - person igouy; 23.08.2010
comment
›› Вы читали курс Point? ‹‹ Какое откровение вы ожидаете от меня, когда я увижу методы, которые возвращают значения, а не изменяют состояние? - person igouy; 23.08.2010
comment
Да, и Армстронг передумал: Erlang может быть ЕДИНСТВЕННЫМ объектно-ориентированным языком. - infoq.com/interviews/johnson-armstrong-oop (и мы теперь отклоняюсь от темы) - person Frank Shearar; 23.08.2010
comment
@igouy re Point class: у вас есть куча именованных функций с побочными эффектами. Что у вас есть функциональный API для объекта. Что, по сути, ОО и ФП пересекаются. На самом деле, я ожидаю, что вы это знаете. - person Frank Shearar; 23.08.2010
comment
@Frank Shearar - я предполагаю, что ФОРТРАН, который я использовал в 1975 году, позволил мне объявить функции без побочных эффектов. Как вы думаете, это делает ФОРТРАН функциональным языком программирования? - person igouy; 24.08.2010
comment
@igouy, вы не определили, каково ваше представление о FPL. У меня все просто: если ваш язык естественным образом заставляет вас писать в стиле FP, то это FPL. Не то чтобы вы могли подделать его, передавая void * вокруг, но о, это идиоматично. - person Frank Shearar; 24.08.2010
comment
@Frank Shearar - Итак, пожалуйста, скажите, достаточно ли, согласно вашей простой идее, возможности объявить функции без побочных эффектов в FORTRAN, чтобы сделать FORTRAN FPL? - person igouy; 24.08.2010
comment
Вы перевираете мои слова. Я никогда не утверждал этого. Я сказал, что ЕСЛИ ФОРТРАН поддерживает ВСЕ: функции первого класса, замыкания, поддержку неизменного состояния, ЕСТЕСТВЕННОЕ И ИДИОМАТИЧЕСКОЕ ИСПОЛЬЗОВАНИЕ FP, ТОГДА я бы назвал FORTRAN FPL. Я не говорю на ФОРТРАНе, поэтому скажите мне: поддерживает ли ФОРТРАН все эти вещи? Облегчает ли это написание в FP? - person Frank Shearar; 24.08.2010
comment
@Frank Shearar ›› Ты искажаешь мои слова. Я никогда не утверждал этого. ‹‹ И я не сказал, что вы это сделали, я задал очень-очень простой вопрос - пожалуйста, скажите, достаточно ли, согласно вашей простой идее, возможности объявить функции без побочных эффектов в FORTRAN, чтобы сделать FORTRAN FPL? - person igouy; 25.08.2010
comment
Нет. Простого наличия функций без побочных эффектов недостаточно для создания FPL. (Контрпример: C.) Итак, что вы считаете достаточными условиями для FPL? - person Frank Shearar; 25.08.2010
comment
Учитывая, что наличия функций без побочных эффектов недостаточно для создания FPL, если ради аргумента мы проигнорируем тот факт, что код является объектно-ориентированным, и скажем, что методы класса Squeak's Point являются функциями, то будет ли этого достаточно для сделать Smalltalk FPL? - person igouy; 25.08.2010
comment
Ясно, что нет - вы можете сделать это на C. Чего я не понимаю, так это того, почему вы не атакуете Smalltalk - это позиция FPL с сильного угла - если вы сказали: "Эй, он не поддерживает неизменяемые данные". Вы должны гарантировать неизменность посредством соглашения, и Smalltalk даже не предупреждает вас о том, что что-то имеет побочные эффекты, как в Common Lisp, где вы, по крайней мере, видите nconc или в Scheme, который вы видите set! тогда я мог видеть вашу точку зрения. Чего я не вижу, так это того, как организация функций/методов в классе по сравнению с их организацией в модуле/пакете имеет какое-либо значение для чего-либо. - person Frank Shearar; 25.08.2010
comment
@Frank Shearar ›› Ясно, что нет - вы можете сделать это на C. ‹‹ Итак, вы понимаете, что ваши предыдущие неоднократные ссылки на класс Squeak's Point были неуместны до такой степени, что были фиктивными. - person igouy; 25.08.2010
comment
@Frank Shearar ›› Чего я не понимаю, так это того, как организовать функции/методы... ‹‹ Мне любопытно, смотрели ли вы Синтез объектно-ориентированного и функционального дизайна для содействия повторному использованию? - person igouy; 25.08.2010
comment
@igouy Да, это интересная, аккуратная статья. И? Это не объясняет, почему вы думаете, что (а) метод не является функцией и (б) как группировка этих методов/функций в нечто, называемое классом, как-то менее FP, чем группировка их в пакет или модуль. Что документ действительно иллюстрирует, так это то, что Visitor является хакером как в хвалебном, так и в уничижительном смысле этого слова. - person Frank Shearar; 25.08.2010
comment
@igouy re Point: я пытался решить реальную проблему о том, что Smalltalk является/не является FPL, то есть управлением состоянием. Так что, пожалуйста, критикуйте это, потому что это действительно веский аргумент. Сказать, что Smalltalk не является FPL, потому что в нем отсутствуют функции, — это нонсенс. Я начинаю думать, что Smalltalk не FPL, потому что вы, программист, должны обеспечивать неизменность, а это чревато ошибками. Состояние, а не методы не являются функциями. - person Frank Shearar; 25.08.2010
comment
@Frank Shearar ›› неизменность ‹‹ 2 дня назад вы сказали: «Да, вы МОЖЕТЕ писать изменяемые состояния в Smalltalk. Вы можете сделать это и в Common Lisp, который обычно считается функциональным языком программирования. А некоторые чисто функциональные языки предусматривают деструктивное преобразование состояния, поэтому, возможно, фраза, которую вы ищете, — это ссылочная прозрачность. - person igouy; 26.08.2010
comment
@Frank Shearar ›› ... интересный, аккуратный документ ... Он не объясняет, почему вы так думаете ... ‹‹ Указывает ли он разницу между тем, какие функциональные и объектно-ориентированные возможности? - person igouy; 26.08.2010
comment
@Frank Shearar ›› как группировка этих методов/функций в нечто, называемое классом, каким-то образом менее FP, чем группировка их в пакет или модуль ‹‹ На этот вопрос FP — это отвлечение, это в основном объектно-ориентированное программирование по сравнению с абстрактными типами данных 1990 pdf google.com/ - person igouy; 26.08.2010
comment
@igouy спасибо за ссылку. Я занят, работая над этим. - person Frank Shearar; 27.08.2010
comment
@Фрэнк Ширар - О! ты это читаешь! :-) Возможно, вы захотите перейти на 20 лет вперед к новому пониманию абстракции данных (pdf) cs.utexas.edu/users/wcook/Drafts/2009/essay.pdf - person igouy; 28.08.2010
comment
@igouy: :P Да, и эта статья тоже в моем списке к прочтению, когда Стил недавно сослался на нее (projectfortress.sun.com/Projects/Community/blog/). (Это когда вы говорите хорошо, если бы были, мы бы не спорили? :) ) - person Frank Shearar; 28.08.2010
comment
@igouy Наконец-то я нашел ту статью Scheme/OO, которую пытался вспомнить: ccs.neu.edu/home/matthias/Presentations/ecoop2004.pdf В любом случае, мне нужно еще многое прочитать, прежде чем я смогу продолжить обсуждение. - person Frank Shearar; 30.08.2010
comment
@igouy Я не понимаю, как Кук говорит, что Smalltalk не FPL. Я вижу этот объект ADT !=, и он говорит, что это может быть написано как в функциональном, так и в императивном порядке. Две независимые оси! На данный момент, я не думаю, что мы когда-либо найдем общий язык, поэтому я откланяюсь с ядром моего утверждения: Однако естественное использование Smalltalk часто приводит к функциональному коду. и оставьте это на этом. - person Frank Shearar; 03.09.2010
comment
@Frank Shearar - На что отвечает припев, естественное использование Smalltalk часто не приводит к функциональному коду. - person igouy; 04.09.2010
comment
@Frank Shear: «Организация в объекты не является аргументом против того, чтобы Smalltalk не был функциональным языком». Конечно, это является! Блок не является функцией! Неспособность иметь именованную функцию на верхнем уровне (точно так же, как класс) делает ее нефункциональной! Наличие неизменяемых объектов не делает его функциональным! Ваш хорошо проголосовавший ответ, к сожалению, просто неверен. - person Angel O'Sphere; 21.09.2011
comment
Конечно, блок — это функция. Если быть точным, это замыкание. Между foo(self, 1) и self.foo(1) совсем нет никакой разницы. Прочтите книгу Уильяма Кука Понимание абстракции данных, новый взгляд и Парадигмы программирования для чайников Ван Роя. Они наглядно демонстрируют разницу между императивным и функциональным, с одной стороны, и абстрактными типами данных и объектами, с другой. Ортогональные оси! - person Frank Shearar; 21.09.2011

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

person Manuel Araoz    schedule 20.08.2010
comment
Ну, почти все это что угодно, кроме таких выражений, как 1 или a := b. Кроме того, композиция функций — это именно то, что я имею в виду, говоря, что smalltalk'еры естественно функционально пишут на Smalltalk. Внутренние состояния (наборы переменных экземпляра) идентичны внешне определенным структурам. Скажем, как CONS-ячейка. Или список. Или хэш-карта. (Важная оговорка: вы на самом деле написали методы для своих классов функциональным образом, как в примере с классом Point, который я привожу.) - person Frank Shearar; 22.08.2010
comment
››Внутренние состояния (наборы переменных экземпляра) идентичны внешним структурам. ‹‹ Кроме способов, которыми они не являются, например - их доступности. - person igouy; 23.08.2010
comment
Эр. Да, вы МОЖЕТЕ писать изменяемые состояния в Smalltalk. Вы можете сделать это и в Common Lisp, который обычно считается функциональным языком программирования. Так что, возможно, ваше определение FPL — это язык, на котором вы можете ТОЛЬКО функционально писать? Это исключает целую кучу языков, которые большинство людей считают функциональными: Common Lisp, Scheme, Erlang,... - person Frank Shearar; 23.08.2010
comment
@Frank Shearar - я не упомянул изменчивое состояние, так что, вероятно, ваш комментарий адресован Мануэлю? - person igouy; 23.08.2010
comment
@igouy извините, не самый ясный из моих комментариев. изменчивое состояние было адресовано Мануэлю, но ваше определение FPL было адресовано вам. - person Frank Shearar; 24.08.2010

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

person Matthew Schinckel    schedule 20.08.2010
comment
Что такое неизменность переменной в математическом смысле? Например, в уравнении x^2 - 1 = 0 является ли x неизменным? Делает ли перебор всех возможных значений x ({-1, 1}) его изменяемым? Например, следующий код на Scala: val results: Set[Double] =solve(x^2 - 1 = 0) возвращает все возможные значения x в результаты, но функция 'solve' МОЖЕТ сделать некоторые мутации внутренней переменной , поэтому в Smalltalk любой экземпляр может изменить свое внутреннее состояние, чтобы уточнить ответ. Любой может также написать код, отвечающий на несколько результатов в одном объекте в Smalltalk. - person Dmitry Ovchinnikov; 08.02.2021

Язык не становится функциональным, если у него есть имена функций — по этому определению C будет функциональным! Более важной является функциональная семантика в математическом смысле, что результат зависит только от аргументов (в частности: никаких побочных эффектов). По этому определению объекты, которые могут быть изменены сеттерами, противоречат функциональному стилю программирования. Однако, как уже отмечалось, даже объекты можно использовать в функциональном стиле (пример Rectangle), если запретить побочные эффекты. И, кстати. существует двойственность между объектами с методами и набором функций, которые определены в замыкании над приватным состоянием (подробности см. в SICP). Они могут имитировать друг друга взаимно:

(def (make_foo initVal1 ... initValN)
   (let ((instVar1 initVal1) ... (instVarN initValN))
      (define (method1 args) ...)
      ...
      (define (methodN args) ...)
      (define (lookup selector)
          (cond ((eq? selector 'method1) method1)
             ...
             ((eq? selector 'methodN) methodN)
             (true doesNotUnderstandCode)))
      lookup)) ; returns the lookup function (provides "access into the closure") !

(defMacro (method1 receiver.args)
    ((receiver selector) args))

(define foo (make_foo 1 2 ...))
(method1 foo ...)

приведенное выше является симуляцией «чистых» функциональных объектов и семантически совпадает с большим количеством кода Smalltalk! Однако, чтобы реализовать метод установки, вы должны добавить метод, который выполняет (set! instVar newValue). А потому поставили! нефункциональна, нарушает "функциональность" схемы.

Резюме: смотрите на семантику, а не на источник, Люк!

person blabla999    schedule 23.08.2010
comment
У вас могут быть сеттеры, если ваши сеттеры возвращают новый объект с требуемым состоянием, а не мутируют приемник. - person Frank Shearar; 23.08.2010
comment
›› существует двойственность между объектами с методами и набором функций ‹‹ Да, они дуальны — это не одно и то же. - person igouy; 23.08.2010
comment
›› Язык не становится функциональным языком, если у него есть именованные функции ‹‹ Согласен, но когда в языке нет именованных функций, почему мы думаем, что этот язык пытается быть функциональным языком программирования? - person igouy; 23.08.2010
comment
В Smalltalk есть именованные функции. Они называются методами. Это лямбды, привязанные к символу в словаре, локальном для класса. Вы не объяснили, чем это отличается от лямбда-выражений, привязанных к символам, скажем, в пакете. - person Frank Shearar; 23.08.2010
comment
@Frank Shearar ›› Вы не объяснили, чем это отличается от… ‹‹ Что, как я неоднократно говорил, отличается? cs.brown.edu/~sk /Publications/Papers/Published/kff-synth-fp-oo - person igouy; 24.08.2010
comment
остынь: давайте попробуем определить некоторую общую основу, с которой мы все согласны: 1) функциональный стиль использует функции без побочных эффектов; 2) функциональный язык — это язык, в котором функциональный стиль является наиболее естественным или предпочтительным способом ведения дел. Это делает lisp функциональным языком, хотя он поддерживает нефункциональные операции (например, set!) и объекты (clos и т.п.). Это также делает Smalltalk нефункциональным языком, хотя он также поддерживает все эти функциональные возможности. 3) вы можете программировать стиль oo в lisp, а также функциональный стиль в smalltalk - person blabla999; 24.08.2010
comment
@ blabla999, по-вашему, Пролог - это функциональный язык. Например, x(Y):-some_func(56, 78, L), some_func2(L, 98, M), some_func3(M, 345, Y). - person Dmitry Ovchinnikov; 08.02.2021
comment
@ blabla999, Напротив, в Scala неизменность может гарантировать только разработчик. Вы не можете сказать (не глядя на код или scaladocs), данная функция свободна от побочных эффектов или нет. Более того, любой МОЖЕТ писать программы в функциональном стиле на Smalltalk: везде использовать свежие экземпляры, передавать свежие экземпляры объектов, не делиться объектами и т.д. Я хочу сказать, что Smalltalk может моделировать функциональное поведение и ничто не мешает никому писать программы в функциональном стиле на языке Smalltalk. - person Dmitry Ovchinnikov; 08.02.2021

Спасибо всем за все ответы.

Я добавлю здесь свое, которое в основном является моим (вероятно, пропущенным) пониманием вашего.

Я думаю, что критерием для того, чтобы называть что-то OO или FP, является то, как «материал» создается с использованием языка; не то, насколько легко или сложно это сделать, я имею в виду используемую ментальную парадигму.

Например, как показывают ссылки, в Scala может быть сложнее набрать что-то, чем в OCaml, но это не делает его менее FPL (может быть, неполным или нечистым, но определенно функциональным); потому что целью Scala является использование функций в качестве основных строительных блоков, а не объектов.

С другой стороны, упрощение написания функции на языке не делает ее функциональной, если стиль или цель состоит в использовании других артефактов. Smalltalk, например, позволяет очень легко написать анонимный блок или предоставить подключаемый компаратор сортировки, но это вообще не делает его ЛЮБЫМ функциональным, потому что основное внимание уделяется использованию объектов и передаче сообщений. Блокировка — это всего лишь механизм для кодирования этих сообщений (не функций), даже если они выглядят так же, как и функции.

Путаница возникает, потому что OO и FP ортогональны (как заявил Rahul через twitter), так что это выглядит закодированное сообщение в Smalltalk очень похоже на анонимную функцию в Scala. Но выполнение чего-то подобного не превращает язык одной парадигмы в другую.

Что еще хуже, Scala также использует парадигму объектно-ориентированного программирования, чтобы упростить для основных (Java, C++, C#) программистов переход, и, если вы видите, он имел гораздо больший успех, чем любой другой FPL. И, конечно же, это было благодаря Java (ИМХО, если Clojure будет иметь какой-либо успех по той же причине, JVM)

В заключение: язык программирования можно классифицировать по парадигме, которую он использует для создания "вещей". Существуют чистые языки, такие как [Smalltalk: OO, Haskell: функциональный, C: процедурный], или гибриды, такие как Scala или мультипарадигмальные, такие как C++, Ruby, Python.

Тот факт, что вы можете написать один стиль на другом языке, не делает его языком этого стиля. Например, моделирование объектов с помощью Lisp не делает его объектно-ориентированным, а использование функций с Java не делает его функциональным.

Чтобы ответить на вопрос, чтобы считаться функциональным, Smalltalk должен использовать функции в качестве строительных блоков, чего он не делает, потому что использует объекты.

person OscarRyz    schedule 24.08.2010
comment
Твоя последняя строчка в значительной степени говорит об этом. Играя с языком, разработанным как мультипарадигмальный (я не думаю, что это будет Ruby и, возможно, не Python, а C++ слишком велик), вы получите хорошее представление о том, что значит для языка иметь доминирующий стиль. Мне было очень интересно играть с Моцартом/Озом, потому что переработка программы из одного стиля в другой очень интерактивна — вы можете начать с ООП, переработав ее в императивный стиль, итеративно преобразовать деструктивное присваивание в декларативный стиль, а затем сойти с ума от параллельного логического программирования. - person igouy; 25.08.2010

Я видел некоторое сходство между Smalltalk и FPL, а именно замыкания

Есть и более основное сходство — каждое сообщение Smalltalk всегда возвращает значение.

Но теперь взгляните на принципы проектирования, лежащие в основе Smalltalk.

[Smalltalk] отправляет имя желаемой операции вместе с любыми аргументами в виде сообщения на номер, понимая, что получатель лучше знает, как выполнить желаемую операцию.

Описывает ли это то, что вы считаете функциональным программированием?

@Frank Shearar - это тоже описывает Erlang. Erlang теперь не работает?

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

person igouy    schedule 23.08.2010
comment
Это также описывает Erlang. Erlang теперь не работает? - person Frank Shearar; 23.08.2010
comment
Мой предыдущий комментарий читается немного язвительно. Я не хочу быть (слишком) язвительной. Вышеприведенное также описывает позднее связывание, которое я не считаю несовместимым с FP. - person Frank Shearar; 23.08.2010
comment
@Frank Shearar ›› Erlang теперь не работает? ‹‹ Разве вы уже не цитировали Джо Армстронга, говорящего, что я могу подумать, хотя я не совсем уверен, верю я в это или нет, но Erlang может быть единственным объектно-ориентированным языком? - person igouy; 24.08.2010
comment
@igouy: значит, вы считаете, что язык может быть ЛИБО FPL, ИЛИ OOPL, но никогда тем и другим одновременно? - person Frank Shearar; 24.08.2010
comment
@jgouy Я скучаю по тебе. Я упрям ​​как мул, или вы имеете в виду, что МНОГОЯЗЫЧНОЕ расширение Emacs может меня чему-то научить? - person Frank Shearar; 25.08.2010
comment
@Frank Shearar - я вас развеселю - гибрид между лошадью и ослом - это не лошадь и не осел, это мул. - person igouy; 25.08.2010
comment
@igouy Спасибо за разъяснение. И я рад видеть, что вы уже ответили на мой следующий вопрос, касающийся Erlang :) Я думаю, что в случае с Erlang есть четкое разделение между OO и FP в зависимости от масштаба: внутри процесса у вас есть чисто функциональная парадигма, в то время как связь между процессов лучше всего рассматривать в рамках объектно-ориентированной парадигмы в стиле Кея. (Кей часто говорил, что люди упускают из виду суть Smalltalk — жемчужиной является передача сообщений, а не объектов: lists.squeakfoundation.org/pipermail/squeak-dev/1998-October/) - person Frank Shearar; 25.08.2010
comment
@Frank Shearar - А существо с головой льва, телом козы и хвостом змеи - это не лев, не коза и не змея - это химера. - person igouy; 25.08.2010

Что нужно, чтобы считать его таковым?

  • способ объявления функций, а не способ объявления методов в классе

  • способ структурировать программу вокруг функций, а не вокруг объектов

@Missing Faktor - но разве func в этом примере не является именованной функцией?

|func v|
func := [:x | x + 1].
v := func value: 5.

Нет func — это локальная переменная. Вы привязали анонимную функцию к локальной переменной func.

|func v|
func := [:x | x + 1].
func := 2.
v := func value: 5.

Чтобы увидеть разницу, посмотрите на этот пример Erlang, в котором показаны как анонимная функция, так и названная функция.

person igouy    schedule 21.08.2010
comment
iguy, функция defun Common Lisp связывает анонимную функцию с символом в таблице символов. Насколько я знаю, определение схемы делает то же самое. Так в чем твоя точка зрения? - person Frank Shearar; 22.08.2010
comment
До того, как вы достигнете эквивалентности по Тьюрингу, может пройти всего несколько мгновений. Я считаю, что глупо говорить о том, что язык является функциональным языком программирования, если он не предоставляет именованных функций. Так же, как было бы глупо говорить о том, что C является языком программирования OO, когда он не предоставляет объекты. - person igouy; 23.08.2010
comment
В Smalltalk ЕСТЬ именованные функции, только они называются методами. Пожалуйста, объясните, почему метод НЕ является именованной функцией. Да, метод обращается к состоянию. В случае Point это недостижимые, неизменяемые переменные экземпляра. Как и любой FPL, который вы хотите упомянуть, имеет состояние в виде ADT или чего-то еще. - person Frank Shearar; 23.08.2010
comment
@Frank Shearar - Есть хорошо понятное и фундаментальное различие в том, как мы структурируем программы в ООП и FP - они двойственны. - person igouy; 23.08.2010
comment
Что ж, я называю эту двойственность/дуализм фундаментальной одинаковостью. Может быть, поэтому мы спорим. - person Frank Shearar; 23.08.2010
comment
@Frank Shearar ›› Может быть, поэтому мы спорим ‹‹ В основном вы, кажется, ссоритесь, сосредотачиваясь на сходствах и игнорируя вопиющие различия. - person igouy; 24.08.2010
comment
Как вы, несомненно, знаете из практического опыта, работа в Smalltalk заключается не только в выяснении общности действий (глаголы, функции, методы), но и в извлечении структуры (определение структур, кортежей, классов). FP делает акцент на глаголах, а не на существительных, тогда как OO делает акцент на существительных, а не на глаголах. Я не вижу причин, по которым язык не может поддерживать обе парадигмы, и я утверждаю, что Smalltalkers действительно практикуют как OO, так и FP при написании. Ваше определение FPL выше включает C, который я не считаю ни OOPL, ни FPL. - person Frank Shearar; 24.08.2010
comment
За час до этого вы написали - @igouy, вы не определили свое представление о FPL... - но теперь вы говорите - Ваше определение FPL выше... - person igouy; 24.08.2010
comment
@igouy C ++ - это просто C в перетаскивании, ВСЕ, что может быть написано на C ++, может быть написано на C, OTOH C ++ - не особенно хороший пример объектно-ориентированного языка. - person Jasen; 06.02.2013