在Haskell(“二阶Haskell”)中生成Haskell类型的工具?

在Haskell(“二阶Haskell”)中生成Haskell类型的工具?,haskell,types,metaprogramming,typeclass,type-safety,Haskell,Types,Metaprogramming,Typeclass,Type Safety,如果这个问题有点模糊,请提前道歉。这是周末做白日梦的结果 有了Haskell奇妙的类型系统,将数学(尤其是代数)结构表示为类型类是令人愉快的。我是说,看看!但是,在实践中利用这种美妙的类型结构对我来说总是很困难的 您有一个很好的类型系统方式来表示v1和v2是向量空间V的元素,w是向量空间w的元素。类型系统允许您编写添加v1和v2的程序,但不能添加v1和w。伟大的但是在实践中,您可能想要使用数百个向量空间,并且您肯定不想创建类型V1,V2,…,V100,并将它们声明为向量空间类型类的实例!或者,您

如果这个问题有点模糊,请提前道歉。这是周末做白日梦的结果

有了Haskell奇妙的类型系统,将数学(尤其是代数)结构表示为类型类是令人愉快的。我是说,看看!但是,在实践中利用这种美妙的类型结构对我来说总是很困难的

您有一个很好的类型系统方式来表示
v1
v2
是向量空间
V
的元素,
w
是向量空间
w
的元素。类型系统允许您编写添加
v1
v2
的程序,但不能添加
v1
w
。伟大的但是在实践中,您可能想要使用数百个向量空间,并且您肯定不想创建类型
V1
V2
,…,
V100
,并将它们声明为向量空间类型类的实例!或者,您可能从现实世界中读取一些数据,从而产生符号
a
b
c
——您可能希望表示这些符号上的自由向量空间实际上是向量空间

所以你被卡住了,对吗?为了在科学计算环境中处理向量空间,您必须放弃类型系统,放弃向量空间类型类,让函数执行运行时兼容性检查。你必须这么做吗?难道不能利用Haskell纯粹是函数式的这一事实来编写一个程序,生成您需要的所有类型并将它们插入到实际程序中吗?这种技术存在吗?请务必指出,如果我只是忽略了一些基本的东西(我可能是):-)

编辑:我刚才才发现。我必须考虑一下它们与我的问题之间的关系(非常感谢对此提出的有启发性的意见)。

允许这样做。网站有一些有用的链接;特别是

顶级声明语法就是您想要的语法。通过键入:

mkFoo = [d| data Foo = Foo Int |]
您可以生成一个模板Haskell splice(类似于编译时函数),该模板只需插入行
$(mkFoo)
,即可创建
数据Foo=Foo Int
的声明

虽然这个小示例不太有用,但您可以向mkFoo提供一个参数来控制需要多少不同的声明。现在,
$(mkFoo 100)
将为您生成100个新的数据声明。您还可以使用TH生成类型类实例。我的包是一个非常小的项目,它使用模板Haskell来做类似的事情


另一种方法是使用,它将自动派生类型类实例。如果只需要实例,这可能会更简单。

Haskell中还有一些简单的类型级编程技术。一个典型的例子如下:

-- A family of types for the natural numbers
data Zero
data Succ n

-- A family of vectors parameterized over the naturals (using GADTs extension)
data Vector :: * -> * -> * where
    -- empty is a vector with length zero
    Empty :: Vector Zero a
    -- given a vector of length n and an a, produce a vector of length n+1
    Cons  :: a -> Vector n a -> Vector (Succ n) a

-- A type-level adder for natural numbers (using TypeFamilies extension)
type family Plus n m :: *
type instance Plus Zero n = n
type instance Plus (Succ m) n = Succ (Plus m n)

-- Typesafe concatenation of vectors:
concatV :: Vector n a -> Vector m a -> Vector (Plus n m) a
concatV Empty ys = ys
concatV (Cons x xs) ys = Cons x (concatV xs ys)
花点时间来理解一下。我认为这是相当神奇的工作

然而,Haskell中的类型级编程是在功能“神秘谷”中进行的——这足以让人们注意到有多少事情是不能做的。依赖类型的语言喜欢,并将这种风格发挥到极致

模板Haskell更像是代码生成中常用的LISP宏样式。你写一些代码来写一些代码,然后你说“好,在这里插入生成的代码”。与上述技术不同,您可以通过这种方式编写任何可计算的指定代码,但您无法获得上面的
concatV
中所示的非常通用的类型检查


所以你有一些选择来做你想做的事。我认为元编程是一个非常有趣的领域,在某些方面还很年轻。享受探索的乐趣。:-)

那很有趣!谢谢