Есть ли какие-либо чисто функциональные Схемы, или Шепелявит?

Я играл вокруг с несколькими языками функционального программирования и действительно наслаждаюсь s-expr синтаксисом, используемым, Шепелявит (Схема в особенности).

Я также вижу преимущества работы на чисто функциональном языке. Поэтому:

Есть ли какие-либо чисто функциональные Схемы (или Шепелявит в целом)?

31
задан Don Stewart 16 April 2011 в 20:35
поделиться

7 ответов

Вероятно нет, по крайней мере, не иначе, как игрушки / доказательства концепции. Обратите внимание, что даже Haskell не является на 100% чисто функциональным - у него есть секретные аварийные люки, а все в IO является «чистым» только в каком-то мучительном смысле этого слова ].

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

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

В заключение, поймите, что большая часть «синтаксиса» Haskell - это толстые слои сахара.Базовый язык - это не более чем типизированное лямбда-исчисление, и ничто не мешает вам писать весь код таким образом. Однако другие программисты на Haskell могут посмеяться над вами. Также есть Лискелл , но я не уверен, в каком он состоянии сейчас.

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

12
ответ дан 27 November 2019 в 21:41
поделиться

Я не верю, что есть какие-либо чисто функциональные Lisp, но Clojure, вероятно, наиболее близок.

Рич Хики, создатель Clojure:

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

http://clojure.org/rationale

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

Это сделано намеренно - другая цитата Рича -

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

См. презентацию Clojure для программистов на Лиспе .

15
ответ дан 27 November 2019 в 21:41
поделиться

Существуют ли какие-либо чисто функциональные схемы (или Лиспы в целом)?

Средство доказательства теорем ACL2 является чистым Лиспом. Однако он предназначен для доказательства теорем, а не для программирования, и, в частности, ограничен программами первого порядка. Однако в своей нише он оказался чрезвычайно успешным. Среди прочего, он выиграл 2005 ACM Software System Award .

13
ответ дан 27 November 2019 в 21:41
поделиться

Есть несколько проектов, которые стремятся использовать haskell под лиспи-синтаксисом. Более старый, мертвый и тяжеловесный - «Лискелл». Более новый, более живой и легкий - hasp . Думаю, тебе стоит взглянуть.

3
ответ дан 27 November 2019 в 21:41
поделиться

непоследовательный и нерасширяемый синтаксис

Что здесь означает «несогласованность»?

Странно основывать выбор языка исключительно на синтаксисе. В конце концов, изучение синтаксиса займет несколько часов - это малая часть требуемых инвестиций.

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

Игнорируя все приманки для пламени, быстрый поиск в Google для неизменяемой схемы дает некоторые результаты: http://blog.plt-scheme.org/2007/11/getting-rid-of-set-car-and-set-cdr.html

6
ответ дан 27 November 2019 в 21:41
поделиться

Новый язык Racket (ранее PLT Scheme) позволяет реализовать любую семантику, которая вам нравится, с s-выражениями (на самом деле любой синтаксис). Базовый язык является охотно оцениваемым, динамически типируемым вариантом схемы, но некоторые известные языки, построенные поверх этого, являются ленивой схемой и функциональной реактивной системой, называемой Отцом Временем.

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

#lang racket/base
(provide (except-out (all-from-out racket/base) set! ...more here...))

составляет язык, который не имеет set! .

24
ответ дан 27 November 2019 в 21:41
поделиться

Если вам нравится синтаксис lisp, то вы можете делать аналогичные вещи в Haskell

let fibs = ((++) [1, 1] (zipWith (+) fibs (tail fibs)))

let fibs = в стороне. Вы всегда можете использовать синтаксис s-expr в выражениях Haskell. Это потому, что вы всегда можете добавить круглые скобки снаружи, и это не имеет значения. Это тот же код без лишних скобок:

let fibs = (++) [1, 1] (zipWith (+) fibs (tail fibs))

И вот он в «типичном» стиле Haskell:

let fibs = [1, 1] ++ zipWith (+) fibs (tail fibs)
3
ответ дан 27 November 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: