Защо 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: OO и функционалността не са взаимно изключващи се парадигми.   -  person Frank Shearar    schedule 20.08.2010
comment
@Frank Shearar - Концептуално бих твърдял, че те са взаимно изключващи се. Що се отнася до кода, ние се занимаваме с туринг на пълни езици тук, така че нищо (освен здравия разум) ни спира от ad hoc смес от двете.   -  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 - Защо да избягвате моя директен въпрос, вместо да се възползвате от възможността да намерите области на съгласие и несъгласие? Когато дори не можете да се накарате да кажете - Не, наличието на функция за грях във 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 Да, благодаря, знам какво е sin функция. Моля, направете ми услуга и прочетете какво добавих към редактирания си отговор. Така че в замяна, моля, отговорете на моите въпроси, вместо да се опитвате да превърнете моите аргументи в измама.   -  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
Въпреки че това е стара тема, приемам дефиницията на OO, представена тук. OO е просто изразяване на програма под формата на обекти, които обменят съобщения и капсулират състояние; моделирането на проблемната област директно като обекти не влиза в дефиницията, а по-скоро - IMO - е инструмент или дори трик. В този смисъл една функционална програма може да се разглежда като обекти, капсулиращи нулево състояние и взаимодействащи чрез много прости съобщения (прилагане). Това би направило функционалния модел подмножество на OO. - 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. Освен това, Newspeak (newspeaklanguage.org) е език за програмиране в традицията на Self и Smalltalk, който поддържа неизменността като един от неговите основни понятия. - person Lukas Renggli; 20.08.2010
comment
Това определение не прави ли C#, Javascript и почти всеки език от този век функционален? - person Diego Mijelshon; 20.08.2010
comment
@Диего: Както казах, няма приета дефиниция на термина език за функционално програмиране. Така че, по първо определение, да. Според второ определение, не. - person missingfaktor; 20.08.2010
comment
@Missing Faktor - Smalltalk дори предоставя ли начин за деклариране на именувани функции? - person igouy; 21.08.2010
comment
@igouy: Може и да греша, но не е ли func в този пример наименувана функция? - person missingfaktor; 21.08.2010
comment
@Missing Faktor - Какъв пример? - person igouy; 22.08.2010
comment
@iguoy: Бях включил връзка в коментара си. Изглежда StackOverflow го изяде. Както и да е, ето го отново: ideone.com/NoB1C - person missingfaktor; 22.08.2010
comment
@iguoy: По-добър пример: ideone.com/4NNOv (Благодарение на @SergeStinckwich в Twitter). - 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 Не разбирам за какво спорите. Вашият коментар започва с това изречение: Няма приета дефиниция за език за функционално програмиране. И коригирах това. Със сигурност има общоприето определение за функционални езици. Прочетете wikipedia напр. - person Angel O'Sphere; 14.06.2013

Smalltalk може да не е "чист функционален език" (каквото и да е това). Естественото използване на Smalltalk обаче често води до функционален код. (Това, което предполагам, че хората от Scala биха нарекли „обектно-функционално“.)

Например, класът Point на Squeak има функционален API: методи като 1@1 translateBy: 1@1 връщат нови точки с новото състояние, вместо да променят вътрешното състояние. (Това прави Point практически неизменна, тъй като единственият начин да промените вътрешното състояние на обекта е чрез механизми за отразяване като #instVarAt:.)

Съвсем нормално е да използвате функции от по-висок порядък в Smalltalk като карти, филтри, гънки и други подобни. Като се има предвид, че те са вградени в API за колекции, често е по-лесно да се напише код, който използва колекции по функционален начин, отколкото не.

Толкова много хора имат толкова много дефиниции на „функционален език за програмиране“, че въпросът „Foo FPL ли е“ е също толкова безполезен въпрос, колкото „Foo обектно-ориентиран език ли е“.

Като казах това, ето моите два цента: функционалният език за програмиране е език, в който е естествено и идиоматично да се използват функционални техники: първокласни функции, избягване на променливи състояние, функции без странични ефекти, функции от по-висок ред.

Според това описание Smalltalk е функционален език за програмиране. Той извиква функции от първи ред „методи“ или „блокове“ в зависимост от това дали са именувани или анонимни. Обектите съхраняват състоянието в променливи на екземпляр. Функциите от по-висок ред са просто методи, които приемат блокове като параметри.

Като каза това, да, можете да пишете Smalltalk по нефункционален начин. Той позволява променливо състояние. Това спира ли Smalltalk да се нарича функционален език? Ако е така, нито тези езици са функционални: Common Lisp, Erlang (споделено състояние чрез речника на процеса, ets/dets).

И така, накратко, Smalltalk е FPL защото:

  • Функциите са първокласни обекти (обекти, в Smalltalk - CompiledMethods или BlockClosures, за да бъдем точни).
  • Smalltalk поддържа затваряния (нарича ги блокове).
  • Smalltalk позволява да се пише функционално по естествен, идиоматичен начин.

и Smalltalk не е FPL защото:

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

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

Редактиране: Не разбирам нуждата на igouy от дефиниции на именувани функции, различни от дефиниране на методи на обект. Но както и да е, започваме:

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 програмата е организирана в обекти, но във функционален език за програмиране програмата е организирана във функции. Има добре разбрана и фундаментална разлика в това как структурираме програмите в OOP и FP. За пример вижте Синтезиране на обектно-ориентиран и функционален дизайн за насърчаване на повторната употреба cs.brown.edu/~sk/Publications/Papers/Published/kff-synth-fp-oo - person igouy; 22.08.2010
comment
›› Класът Point на Squeak има функционален API ‹‹ Вие казвате, че поведението се осигурява чрез достъп до екземпляри на клас Point, които не са дефинирани в семейство от функции. - person igouy; 22.08.2010
comment
@igouy: Организирането в обекти не е аргумент срещу Smalltalk да не е функционален език. Вижте Common Lisp (и по-специално CLOS). Вие казвате обект, а аз казвам набор от функции, които работят върху един и същи вид структура, в собственото си пространство от имена. - person Frank Shearar; 22.08.2010
comment
@iguoy: ›› Класът Point на Squeak има функционален API ‹‹ Прочетохте ли класа? Поведението се осигурява от функционални методи (т.е. без странични ефекти, без променливо състояние). Дефинира се в семейство от функции, които случайно наричаме методи. - person Frank Shearar; 22.08.2010
comment
›› Организирането в обекти не е аргумент срещу това, че Smalltalk не е функционален език ‹‹ Smalltalk не е организиран във функции – това е аргумент срещу това, че Smalltalk е функционален език. - person igouy; 23.08.2010
comment
›› Smalltalk на: #func put: [:x | x + 1]. ‹‹ Всъщност така ли се пишат програмите на Smalltalk? Всъщност така ли са написани библиотеките на Smalltalk? - person igouy; 23.08.2010
comment
Прочетохте ли Синтезиране на обектно-ориентиран и функционален дизайн за насърчаване на повторната употреба? - person igouy; 23.08.2010
comment
Прочетохте ли класа Point? Иска ми се да мога да намеря онази статия, която прочетох наскоро, която описва Scheme като първия правилен обектно-ориентиран език, различен от Simula-67. Да, схема. Точно като Erlang е функционален език за програмиране и OO език. (Просто попитайте Джо Армстронг.) - person Frank Shearar; 23.08.2010
comment
Преди години имах кратка дискусия по имейл с Джо Армстронг относно неговата статия Защо OO е гадно - опитвайки се да разбера неговата гледна точка и да изясня това, което ми се струваше недоразумение. Защо 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 за обект. Това всъщност OO и FP се припокриват. Наистина, очаквам вие да знаете това. - person Frank Shearar; 23.08.2010
comment
@Frank Shearar - предполагам, че FORTRAN, който използвах през 1975 г., ми позволи да декларирам функции без странични ефекти - Мислите ли, че това прави FORTRAN функционален език за програмиране? - 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
Ти изопачаваш думите ми. Никога не съм твърдял това. Казах, че АКО FORTRAN поддържа ВСИЧКИ: първокласни функции, затваряния, поддръжка за неизменно състояние, ЕСТЕСТВЕНО И ИДИОМАТИЧНО ИЗПОЛЗВАНЕ НА FP, ТОГАВА бих нарекъл FORTRAN FPL. Не говоря FORTRAN, така че кажете ми: FORTRAN поддържа ли всички тези неща? Улеснява ли писането на 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 - ако в името на аргумента пренебрегнем факта, че кодът е обектно ориентиран и кажем, че методите на класа Point на Squeak са функции, тогава това ще бъде ли достатъчно, за да направите 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. ‹‹ Значи разбирате, че вашите предишни многократни препратки към класа Point на Squeak са били неуместни до степен да бъдат фалшиви. - 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
@Frank Shearar - О! ти го четеш! :-) Може да искате да прескочите 20 години напред до On Understanding Data Abstraction, Revisited (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). Моля, прочетете On Understanding Data Abstraction, Revisited на William Cook и Programming Paradigms for Dummies на Van Roy. Те ясно демонстрират разликата между императивни и функционални, от една страна, и абстрактни типове данни и обекти, от друга. Ортогонални оси! - person Frank Shearar; 21.09.2011

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

person Manuel Araoz    schedule 20.08.2010
comment
Е, почти всичко е нещо различно от изрази като 1 или a := b. Освен това съставът на функциите е точно това, което имам предвид под smalltalkers, които естествено пишат функционално в 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 резултати: Set[Double] = solve(x^2 - 1 = 0) връща всички възможни стойности на x към резултатите, но функцията 'solve' МОЖЕ да направи някои мутации на вътрешна променлива , така че в Smalltalk всеки екземпляр може да промени вътрешното си състояние, за да разработи отговора. Всеки може също така да напише код, отговарящ с множество резултати в един обект в Smalltalk. - person Dmitry Ovchinnikov; 08.02.2021

Един език не се превръща във функционален език, ако има наименувани функции - по тази дефиниция C би бил функционален! По-важна е функционалната семантика в математически смисъл, че резултатът зависи само от аргументите (по-специално: няма странични ефекти). По тази дефиниция обекти, които могат да бъдат модифицирани от сетери, противоречат на функционалния стил на програмиране. Въпреки това, както вече беше посочено, дори обекти могат да се използват във функционален стил (пример с правоъгълник), ако забраните страничните ефекти. И между другото. има двойственост между обекти с методи и набор от функции, които са дефинирани в затваряне над частно състояние (вижте 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-style в lisp, а също и функционален стил в smalltalk - person blabla999; 24.08.2010
comment
@blabla999, според теб Prolog е функционален език. Например 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 например улеснява писането на анонимен блок или предоставянето на подменяем сортиращ компаратор, но това изобщо не го прави НИКАКЪВ функционален, защото фокусът е върху използването на обекти и предаването на съобщения. Blockclosures са само механизъм за кодиране на тези съобщения (не функции), дори ако изглеждат точно като функции.

Объркването идва, защото OO и FP са ортогонални (както Rahul заяви чрез twitter), така че как изглежда кодирано съобщение в Smalltalk, изглежда доста като анонимна функция в Scala. Но правенето на нещо подобно не преобразува език от една парадигма в друга.

За да бъде най-лошото, Scala също използва парадигмата на OO, за да улесни масовите (Java, C++, C#) програмисти да дадат скок и ако видите, има много по-голям успех от всеки друг FPL. И разбира се, това беше благодарение на Java (IMHO, ако Clojure има някакъв успех, това ще бъде точно поради същата причина, JVM)

В заключение: Езикът за програмиране може да бъде класифициран според парадигмата, която използва за изграждане на „неща“. Има езици, които са чисти като [Smalltalk: OO, Haskell: Functional, C: Procedural], или хибриди, като Scala или мулти парадигма, като C++, Ruby, Python.

Фактът, че можете да пишете един стил с другия език, не го прави този език на този стил. Както симулирането на обекти с Lisp не го прави OO, нито използването на функции с Java го прави функционален.

За да отговори на въпроса, за да се счита за функционален, Smalltalk ще трябва да използва функции като градивни елементи, което не е така, защото използва обекти.

person OscarRyz    schedule 24.08.2010
comment
Последният ти ред го казва. Играта с език, проектиран да бъде много парадигмен (не мисля, че това ще бъде Ruby и може би не Python и C++ е твърде голям) дава добро усещане за това какво означава един език да има доминиращ стил. Намерих за много интересно да свиря с Mozart/Oz, защото преработката на програма от един стил в друг е много интерактивна - можете да започнете с OOP да я преработите в императивен стил, итеративно да премахнете деструктивното присвояване, преработвайки в декларативен стил, и след това полудейте с едновременното логическо програмиране. - 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 Благодаря за пояснението. И се радвам да видя, че вече отговорихте на следващия ми въпрос, re Erlang :) Мисля, че в случая на Erlang има спретнато разделение между OO и FP въз основа на мащаба: в рамките на един процес имате чисто функционална парадигма, докато комуникацията между процеси вероятно е най-добре да се мисли в обектно-ориентираната парадигма в стил Кей. (Кей често казва, че хората са пропуснали смисъла на Smalltalk - че скъпоценният камък е предаването на съобщения, а не обекти: lists.squeakfoundation.org/pipermail/squeak-dev/1998-октомври/) - 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
igouy, defun на Common Lisp свързва анонимна функция към символ в таблица със символи. AFAIK, дефинирането на Scheme прави точно същото. И така, какво искаш да кажеш? - 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 - Има добре разбрана и фундаментална разлика в начина, по който структурираме програмите в OOP и 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 in drag, ВСИЧКО, което може да бъде написано на C++, може да бъде написано на C, OTOH C++ не е особено добър пример за OO език. - person Jasen; 06.02.2013