Могут ли программы Haskell быть представлены как Lisp S-выражения?

Это было бы полезно для генетического программирования, которое обычно использует подмножество Lisp как представление для программ.

Я нашел что-то под названием Liskell (синтаксис Lisp, Haskell внутри) в Интернете, но ссылки сломаны, и я не могу найти на нем бумагу...

Ответы

Ответ 1

Отметьте Lisk, который был предназначен для исправления авторских схваток с помощью Liskell.

В свободное время я работаю над проектом Lisk. Используя параметр -pgmF для GHC, вы можете предоставить GHC имя программы, которое вызывается для предварительной обработки файла перед компиляцией GHC. Он также работает в GHCi и импорте. Вы используете его следующим образом:

{-# OPTIONS -F -pgmF lisk #-}
(module fibs
  (import system.environment)

  (:: main (io ()))
  (= main (>>= get-args (. print fib read head)))

  (:: test (-> :string (, :int :string)))
  (= test (, 1))

  (:: fib (-> :int :int))
  (= fib 0 0)
  (= fib 1 1)
  (= fib n (+ (fib (- n 1))
              (fib (- n 2)))))

Источник здесь.

Кроме того, если вы действительно не заботитесь о Haskell и просто хотите некоторые из его функций, вы можете проверить Qi (или его преемник Shen), который имеет синтаксис s-expression со многими современными функциями функционального программирования, подобными Haskell.

Ответ 2

Вам может быть интересен проект, над которым я работал, схема шелухи.

В основном это позволит вам вызвать код схемы (S-выражения) из Haskell и наоборот. Таким образом, вы можете смешивать этот код внутри своей программы, а затем обрабатывать s-выражения как родные типы данных Haskell, если хотите что-то сделать на стороне Haskell.

В любом случае, это может быть полезно для вас или нет - посмотрите и решите сами.

Ответ 3

Очевидным ответом является "да" - неудивительно, учитывая, что S-выражения были предназначены как простое и равномерное представление анализируемого кода. Дело в том, что такие языки, как Haskell или ML, имеют некоторые проблемы с этим. Я однажды сделал что-то похожее на OCaml (злоупотреблял CamlP4 и написал некоторую функцию, которая переводит P4 AST в какое-то представление, похожее на sexpr), и забава начинается, когда вы сталкиваетесь с аналогичными узлами AST, которые имеют разные типы, потому что они на самом деле не являются то же... Например, есть функциональное приложение, и есть аналогичная форма, которая используется в шаблонах, и еще одна форма, которая используется в выражениях типа.

Моя догадка заключается в том, что попытка генетического программирования таким образом, вероятно, страдает от слишком большого количества нежелательных программ, которые не имеют никакого значения. Но это неудивительно и для любого статически типизированного языка - динамически типизированного языка позволит больше нежелательной. Сравнение двух миров WRT с генетическим программированием может быть интересным по причинам, выходящим за пределы AI...

Ответ 5

В большинстве программ генетического программирования программы представлены как абстрактные синтаксические деревья (AST), которые оцениваются непосредственно в этой форме. Синтаксис Lisp S-expression проявляется только тогда, когда программы выводятся как исходный код. Рассматривали ли вы просто модификацию выходного модуля в выбранном вами программном обеспечении для получения исходного кода Haskell из АСТ?