函数式编程-Haskell程序可以表示为Lisp S-表达式吗



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

我在网上找到了一个叫做Liskell的东西(Lisp语法,里面有Haskell),但链接断了,我找不到上面的纸…

看看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)))))

消息来源在这里。

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

你可能对我一直在做的一个项目感兴趣,外壳方案。

基本上,它将允许您从Haskell调用Scheme代码(S-表达式),反之亦然。因此,您可以在程序中混合这些代码,然后当您想在Haskell方面做一些事情时,将s表达式处理为本地Haskell数据类型。

不管怎样,它可能对你有用,也可能不有用——看看,自己决定。

在大多数遗传编程软件中,程序被表示为抽象语法树(AST),直接以该形式进行评估。只有当程序作为源代码输出时,Lisp S-表达式语法才明显。您是否考虑过只修改所选软件中的输出模块,从AST中生成Haskell源代码?

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

我的猜测是,试图以这种方式进行基因编程可能会受到太多毫无意义的垃圾程序的影响。但对于任何静态类型的语言来说,这也不足为奇——动态类型的语言会允许更多的垃圾进入。将WRT和遗传编程这两个世界进行比较可能会很有趣,原因超出了人工智能…

Liskell的论文位于http://clemens.endorphin.org/ILC07-Liskell-draft.pdf而liskell.org网站似乎仍在正常运行。

最新更新