Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何实现Haskell扩展?_Haskell_Ghc_Ghci - Fatal编程技术网

如何实现Haskell扩展?

如何实现Haskell扩展?,haskell,ghc,ghci,Haskell,Ghc,Ghci,我有几个Haskell扩展的想法,可以通过将扩展语言转换为普通语言来实现(扩展将提供一些pragma和关键字)。 实施它们的更好方式是什么?它应该建立在GHC之上 其中一个想法是为“函数类”添加关键字,这些类将由函数自动定义。 例如,通过这个假设的扩展,标准Num类可以这样定义: class (funclass(+) a,funclass(-) a, ...) => Num a 在我看来,有三种方法可以做到这一点: 实现一个预处理器,它读取扩展的Haskell源代码,将其转换为普通的Ha

我有几个Haskell扩展的想法,可以通过将扩展语言转换为普通语言来实现(扩展将提供一些pragma和关键字)。 实施它们的更好方式是什么?它应该建立在GHC之上

其中一个想法是为“函数类”添加关键字,这些类将由函数自动定义。 例如,通过这个假设的扩展,标准Num类可以这样定义:

class (funclass(+) a,funclass(-) a, ...) => Num a

在我看来,有三种方法可以做到这一点:

  • 实现一个预处理器,它读取扩展的Haskell源代码,将其转换为普通的Haskell,并将其保存回磁盘。然后,您可以按照正常方式编译已翻译的Haskell代码

  • 使用模板Haskell实现一些代码,这些代码将为您进行翻译。(特别是,某些类型的准引用语可能是合适的。)

  • 修改GHC本身。(这显然需要重新编译GHC,然后检查您是否无意中破坏了任何现有功能。)我认为这可能是一项非常艰巨的工作

  • 我正要提到你可以写一个GHC插件——然而,这样的插件不允许你定义新的语法。(尽管它们确实允许您定义新的编译器pragma,然后将其转换为普通的Haskell。)如果您可以使用这种方法,这意味着您可以避免重新编译GHC。您只需要编写一个小型的、自包含的插件。但模板Haskell可能会更容易完成这项工作

    至于你提议的延期是否是个好主意。。。我不认为是这样,但当然欢迎你尝试使用它

    我有几个关于Haskell扩展的想法,可以通过将扩展语言转换为普通语言来实现

    SugarHaskell就是为此而建的。它是可扩展语言项目的一部分。另请参见和

    SugarHaskell潜在的优点关于SugarHaskell:它附带了一个可扩展的语法,支持布局约束的模块化规范,因此您可以轻松定义行为类似do符号的语法。它附带了一个Eclipse插件,可以识别语法扩展,因此您可以获得可扩展的语法突出显示。Eclipse插件的其他特性也是可扩展的(代码完成、错误报告、大纲视图等等)

    SugarHaskell潜在的弱点关于SugarHaskell:它是用Java(胶水代码和Eclipse插件)、SDF(语法)和Stratego(desugarings)实现的。黑客软件包主要包含一堆Java代码。这不一定是一个弱点,但您可能更愿意使用Haskell来指定您的Desugaring,而不是Stratego。在Eclipse之外的其他编辑器中没有集成。Eclipse插件具有很好的可扩展性,但对Haskell的基本支持很弱,因此它目前不能真正用于大型Haskell项目


    考虑到潜在的弱点,SugarHaskell不适合今天的生产使用,但它可能有助于语言扩展的实验和原型设计。

    虽然这是一个有趣的想法,想到它实际上是如何使用的,我会可怕地想起C++的临时重载——可能有不太严重的duck键入错误,但您仍然需要非常小心实例的签名,标准Haskell类实例很好地消除了这一点。而且,由于您可以使类任意细粒度,我看不到任何真正的优势,即使是在避免样板文件方面也是如此。@leftaroundabout这个想法对于自动创建大多数通用模块非常有用。在这个例子中,虽然我们可以定义复数,但作为Num的一个实例,我们不能这样定义矩阵,原因很明显。但是对它们和基于它们的函数使用(+)和(-)仍然是有用的。通过这个扩展,我们可以将矩阵定义为(+)和(-)的实例
    Num
    作为一个名称是非常具有描述性的,并且将
    (+)
    (-)
    限制为这样的实际数字,但是要求将
    (^+^)
    用于矩阵等。对我来说,这似乎不是一个坏的权衡,因为它简化了前奏,对许多更简单的Haskell项目没有影响,对于那些需要向量空间的项目,几乎没有什么麻烦。。顺便说一句,你甚至可以为矩阵创建一个
    Num
    实例,尽管
    abs
    signum
    有点奇怪。当然,还有一个,它尽可能精细地分割数值类,所以
    (+)
    实际上适用于任何组,等等。@leftaroundout off-course,我们可以简单地重新定义一些东西,使其具有普遍性,但这个假设的扩展将允许构建尽可能具有普遍性的东西。这很简单,但我至少需要一些正确的Haskell解析器(原生解析器)。我在谷歌上搜索了“haskell解析器”,但没有找到我需要的东西(可以在haskell中使用的解析器和解析器)。@Anonymous会为您提供很好的服务。同时,请您参考。