6

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

function f(a, b) = c + 42 
    where c = a * b 

(Скажите это подмножество Lisp, который включает в себя «определении функции» и «пусть».)

И представьте себе, что она включает в себя неизменной объекты, которые выглядят как:

struct s(a, b, c = a * b) 

Снова в Лисп проводящей аналогии (это время надмножества), скажем, определение структуры как это будет генерировать функции для:

make-s(a, b) 
s-a(s) 
s-b(s) 
s-c(s) 

Теперь, учитывая простую настройку, кажется очевидным, что существует много сходства между тем, что происходит за кулисами, когда вы вызываете «f» или «make-s». Когда «a» и «b» предоставляются во время вызова/создания экземпляра, для вычисления «c» достаточно информации.

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

Является ли моя игрушечная модель настолько упрощенной, что она бесполезна? Или это действительно полезный способ подумать о том, как работают настоящие языки? Существуют ли какие-либо реальные языки/реализации, которые кто-то, не имеющий опыта работы с CS, но с интересом к языкам программирования (то есть мне), должен узнать больше, чтобы изучить эту концепцию?

Спасибо.

EDIT: Спасибо за ответы до сих пор. Чтобы немного разобраться, я думаю, что мне интересно, есть ли какие-либо реальные языки, где это происходит, когда люди, изучающие язык, говорят, например. «вы должны думать о том, что объекты являются, по сути, закрытием». Или, если есть какие-либо реалии реального языка, где это происходит, когда экземпляр объекта и вызов функции фактически имеют общие (нетривиальные, т. Е. Не только вызовы библиотеки) кодовые или структурные данные.

Является ли аналогия, которую я делаю раньше, какие-либо другие, раньше, чем любая другая аналогия в любых реальных ситуациях?

+0

Ну, конечно, есть аналогия. 'make-s' можно рассматривать как фабрику, которая по определению является функцией. И я действительно нашел интересным, хотя и не слишком важным для моего кодирования-fu, подумать о методах (включая фабрики/конструкторы) как функции и области функции как символ (/ string) => отображение значений. Python делает оба. +1, потому что я люблю такие вещи. – delnan

+0

Вид связанного: http://stackoverflow.com/questions/2497801/closures-are-poor-mans-objects-and-vice-versa-what-does-this-mean – missingfaktor

ответ

1

Оба f и make-s являются функциями, но сходство не идет гораздо дальше. Применение f вызывает функцию и выполняет ее код; применение make-s создает структуру.

В большинстве реализаций языка и modelizations, make-s является другим видом объекта от f: f является закрытием, в то время как make-s является конструктор (в функциональных языках и логическое значении, что близко к объекту ориентированных языков смысла) ,

Если вы хотите думать объективно-ориентированным способом, у нас есть метод apply, но они имеют совершенно разные реализации этого метода.

Если вы хотите думать в терминах логики, лежащей в основе, f и make-s имеют тип build на конструкторе типа samme (конструктор типа объекта), но они построены по-разному и имеют разные правила уничтожения (приложение-функция против приложения-конструктора).

Если вы хотите понять этот последний абзац, я рекомендую Types and Programming Languages от Benjamin C. Pierce. Структуры обсуждаются в §11.8.

+0

Это также очень полезный ответ. – jtolle

+0

Хотя я принял этот ответ, потому что, по-моему, это наиболее прямо связано с тем, о чем мне было интересно, я хотел бы выделить ответ из @dave ниже. Между двумя, я думаю, можно с уверенностью сказать, что ответ: «никакие языки, которые вы разработали, не будут реализованы таким образом, но вполне возможно, что что-то достаточно упрощенное (как переводчик лямбда-исчисления)». – jtolle

1

Существует взаимосвязь между объектами и затворами. http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg03277.html

Следующая создает то, что некоторые из них могут вызвать функцию, и другие могут вызвать объект:
Взятые из SICP (http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-21.html)

(define (make-account balance) 
    (define (withdraw amount) 
    (if (>= balance amount) 
     (begin (set! balance (- balance amount)) 
       balance) 
     "Insufficient funds")) 
    (define (deposit amount) 
    (set! balance (+ balance amount)) 
    balance) 
    (define (dispatch m) 
    (cond ((eq? m 'withdraw) withdraw) 
      ((eq? m 'deposit) deposit) 
      (else (error "Unknown request -- MAKE-ACCOUNT" 
         m)))) 
    dispatch) 
+0

Спасибо за ссылки. Я знаю, что есть аналогия между объектами и замыканиями. См. Мое редактирование на мой вопрос, но мне интересно, если он когда-либо идет глубже, чем просто аналогия, по крайней мере, для случая взаимосвязи между созданием неизменяемого объекта и вызовом функции. – jtolle

1

Является ли моя игрушка модель настолько упрощена, что это бесполезно?

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

+0

И этот ответ, и z5h полезны для меня, но см. Мой отредактированный вопрос и комментарий, который я оставил на ответе z5h. Ясно, что аналогия, которую вы описали, бесполезна. Но я пытался ограничить его ... созданием непреложных объектов и вызовом функций. Это имеет значение? – jtolle

3

Вы не можете получить гораздо более чистый, чем исчисление лямбда: http://en.wikipedia.org/wiki/Lambda_calculus. Исчисление лямбда на самом деле так чисто, оно имеет только функции!

Стандартный способ реализации пары в лямбда-исчислении, например, так:

pair = fn a: fn b: fn x: x a b 
first = fn a: fn b: a 
second = fn a: fn b: b 

Так pair a b, что вы могли бы назвать «»-структуру, на самом деле является функцией (fn x: x a b). Но это особый тип функции, называемый замыканием. Закрытие по существу является функцией (fn x: x a b) плюс значения для всех «свободных» переменных (в данном случае a и b).

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

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

К сожалению, если это все очевидно, и вы просто хотели некоторые реальный пример ...

+0

Это очень полезно. Реальный мета-вопрос для меня - научиться думать о разных языках, а не о мешках независимых синтаксических элементов, которые можно объединить, чтобы делать вещи, но как связанные (хотя и с конкретными синтаксисами) «обертки» для более фундаментальных понятий. Благодаря! – jtolle

+3

@jtolle: Вас может заинтересовать книга * Понятия, методы и модели компьютерного программирования * Peter van Roy и Seif Haridi. Они утверждают, что языки программирования могут быть разложены в соответствии с * Парадигмами *, которые они поддерживают (например, OOP или Logic Programming), и эти парадигмы могут быть далее разложены на * Concepts *. Питер Ван Рой имеет этот великолепный плакат с классификацией принципиальных парадигм программирования *, в котором перечислены 34 парадигмы, которые состоят примерно из примерно 18 понятий. Итак, те «фундаментальные концепции», которые вы ищете ... они даже * назовут их! –

+0

@Jorg W Mittag, спасибо за эту рекомендацию! Книжная страница здесь: http://www.info.ucl.ac.be/~pvr/book.html, ссылка на свободно доступный проект, опубликованный автором здесь: http://lambda-the-ultimate.org/node/3108 # comment-45392, Плакат здесь: http://www.info.ucl.ac.be/~pvr/paradigms.html, доступный вид («парадигмы программирования для чайников»), статья здесь: http://www.info. ucl.ac.be/~pvr/VanRoyChapter.pdf – jtolle