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