Haskell程序可以表示为Lisp S表达式吗?

Yan*_*Yin 14 lisp haskell functional-programming genetic-programming

这对于遗传编程很有用,遗传编程通常使用Lisp子集作为程序的表示.

我在网上找到了一个名为Liskell(Lisp语法,Haskell里面)的东西,但链接坏了,我找不到它上面的文件......

Jon*_*ran 15

查看Lisk,它旨在解决作者对Liskell的抱怨.

在业余时间,我正在开展一个名为Lisk的项目.使用GHC的-pgmF选项,您可以为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)))))
Run Code Online (Sandbox Code Playgroud)

来源就在这里.

另外,如果你实际上并不关心Haskell而只是想要它的一些功能,你可能想看看Qi(或其继承者Shen),它具有s表达式语法,具有许多类似于Haskell的现代函数编程特性.


Jus*_*ier 6

你可能对我一直在做的项目感兴趣,这是一个稻壳计划.

基本上它会让你从Haskell调用Scheme代码(S表达式),反之亦然.因此,您可以将该代码混合到程序中,然后在希望在Haskell端执行某些操作时将s表达式作为本机Haskell数据类型进行处理.

无论如何,它可能对你有用,或者不是 - 看看并自己决定.


Eli*_*lay 3

显而易见的答案是“是”——这并不奇怪,因为 S 表达式的目的是作为解析代码的简单且统一的表示。问题是像 Haskell 或 ML 这样的语言往往会出现一些问题。我曾经做过一些类似于 OCaml 的事情(滥用 CamlP4 并编写了一些函数,将 P4 AST 转换为某种类似 sexpr 的表示),当您遇到具有不同类型的类似 AST 节点时,乐趣就开始了,因为它们并不是真正的相同...例如,有函数应用程序,有一种类似的形式用于模式,还有另一种形式用于类型表达式。

我的猜测是,尝试以这种方式进行遗传编程很可能会遇到太多没有任何意义的垃圾程序。但这对于任何静态类型语言来说也不足为奇——动态类型语言将允许更多垃圾进入。出于人工智能之外的原因,将这两个世界的 WRT 与遗传编程进行比较可能会很有趣......