Могут ли программы 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...
Ответ 4
Бумага Лискелла находится в http://clemens.endorphin.org/ILC07-Liskell-draft.pdf, и сайт liskell.org, похоже, все еще в целом.
Ответ 5
В большинстве программ генетического программирования программы представлены как абстрактные синтаксические деревья (AST), которые оцениваются непосредственно в этой форме. Синтаксис Lisp S-expression проявляется только тогда, когда программы выводятся как исходный код. Рассматривали ли вы просто модификацию выходного модуля в выбранном вами программном обеспечении для получения исходного кода Haskell из АСТ?