Использование концепций функционального языка с ОО - есть ли язык? - PullRequest
3 голосов
/ 15 июня 2009

Я недавно думал о том, что я не всегда использую красивые концепции ОО при написании программ на Pythonic. В частности, я подумал, что мне было бы интересно увидеть язык, на котором я мог бы написать типичный веб-скрипт как

# Fictional language 
# This script's combined effect is to transform (Template, URI, Database) -> HTTPOutput

HTTPOutput: 
    HTTPHeaders + Maintext

Flags:                              # This is a transform URI -> Flags 
    value = URI.split('?').after
    refresh = 'r' in value
    sort = /sort=([a-z])/.search(value)

HTTPHeaders:                       # This is a transform Flags -> HTTPHeaders
    'Content-type:...' +  Flags.refresh ? 'Refresh: ...' : ''

Maintext:
    Template.replace('$questions', PresentedQuestions [:20] )

Questions:
    (Flags.sort = 'r') ? RecentQuestions : TopQuestions 

PresentedQuestions:
    Questions % '<h4>{title}</h4><p>{body}</p>'

RecentQuestions:
    Database.Questions . sort('date')  

TopQuestions:
    Database.Questions . sort('votes') 

Видишь, что происходит? Я пытаюсь сделать как можно больше предметов; каждый абзац объявляет что-то, что я называю transform . Например, есть преобразование HTTPHeaders. На императивном языке, который будет объявлением класса, объекта и функции вместе взятых:

class HTTPHeaders_class
{
     public char* value
     HTTPHeaders_class() 
     {
         value = ... + Flags.refresh ? + ... // [1] 
     }

}

class Flags_class 
{
     public char* flagstring;
     public bool refresh;
     ...
     Flags_class() 
     {
         value = ... /* [3] */ 
         refresh = ...
     }
}

Flags = new Flags_class (URI)
HTTPHeaders = new HTTPHeaders_class (Flags)   // [2]

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

Я, конечно, стараюсь использовать такие вещи, как классы Python, инфраструктура M-V-C и Django (благодаря ответу), но я не думаю, что у них есть концепции выше и ниже.

  1. Каждый объект имеет поле value, к которому можно обратиться, просто написав имя класса.
  2. Если куда-то ссылается HTTPHeader, это означает, что статический неизменяемый объект HTTPHeader создается как можно скорее. Все ссылки на HTTPHeader затем ссылаются на этот объект.
  3. Предположим, я хочу повторить программу с тем же объектом URI, пока интерпретатор еще находится в памяти. Поскольку Flags зависит только от URI и HTTPHeaders только от Flags, они не пересчитываются. Однако, если Database изменено, то Questions необходимо пересчитать, и, следовательно, HTTPOutput также может измениться.
  4. Интерпретатор автоматически определяет правильную последовательность инициализации классов. Конечно, их зависимость должна сформировать дерево.

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

Ответы [ 6 ]

4 голосов
/ 15 июня 2009

Взгляните на F # . Он специально разработан как функциональный язык (на основе OCaml ) с поддержкой OO с использованием стека .NET.

4 голосов
/ 15 июня 2009

Если вы действительно хотите углубиться в разработку веб-приложений на Python, посмотрите на Django . В этом случае вам лучше использовать архитектуру MVC, а Django очень хорошо поддерживает приложения MVC.

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

В любом случае покопайтесь в Model-View-Controller и Django. Вы, вероятно, обнаружите, что он полностью соответствует требованиям.

1 голос
/ 18 августа 2016

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

1 голос
/ 18 июня 2009

Это на самом деле очень похоже на Haskell, за исключением того, что вы здесь не используете чистые функции. Например, Flags не имеет переданного URI; URI - это отдельное определение, которое, по-видимому, не выдает один и тот же URI при каждом вызове и т. Д.

Чтобы URI была чистой функцией, она должна иметь параметр, который будет выдавать текущий запрос, чтобы она всегда могла возвращать одно и то же значение для одних и тех же входных данных. (Без каких-либо параметров для работы, чистая функция может возвращать только один и тот же результат в течение срока службы замыкания.) Однако, если вы хотите избежать явного указания URI параметра каждый раз, это можно сделать различными способами; мы делаем это с помощью монад в Хаскеле.

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

1 голос
/ 15 июня 2009

Ваш код выглядит как DSL для веб-приложений, а Sinatra - такой DSL. Синатра не делает точно то, что вы делаете там, но он находится в том же поле. http://www.sinatrarb.com/ - он написан на Ruby, но, эй, давайте все будем дружить здесь, на земле динамических языков.

1 голос
/ 15 июня 2009

Не думаю, что это именно то, что вы ищете, но Scala пытается объединить ОО и функциональные возможности под общим языком.

...