haskell - 在 Haskell ("second order Haskell"中生成 Haskell 类型的工具?

标签 haskell types metaprogramming typeclass type-safety

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

借助 Haskell 出色的类型系统,将数学(尤其是代数)结构表达为类型类是非常令人愉快的。我的意思是,看看 numeric-prelude !但在实践中利用如此美妙的类型结构对我来说总是很困难。

您有一种很好的类型系统方式来表达 v1v2 是向量空间 V 的元素,并且 w 是向量空间W 的一个元素。类型系统允许您编写添加 v1v2 的程序,但不能添加 v1w。伟大的!但在实践中,您可能想要使用潜在的数百个向量空间,并且您当然不想创建类型 V1V2、...、 V100 并声明它们是向量空间类型类的实例!或者,您可能从现实世界读取一些数据,产生符号 abc - 您可能想要表达自由向量空间这些符号上确实是一个向量空间!

所以你被困住了,对吧?为了在科学计算环境中完成您想要使用向量空间做的许多事情,您必须通过放弃向量空间类型类并让函数进行运行时兼容性检查来放弃类型系统。你必须这样做吗?难道不应该利用 Haskell 纯函数式的事实来编写一个程序来生成您需要的所有类型并将它们插入到实际程序中吗?存在这样的技术吗?无论如何,请指出我是否只是忽略了这里的一些基本内容(我可能是):-)

编辑:刚才我发现fundeps 。我必须考虑一下它们与我的问题有何关系(赞赏对此的启发性评论)。

最佳答案

Template Haskell允许这样做。 wiki page有一些有用的链接;特别是Bulat's tutorials .

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

mkFoo = [d| data Foo = Foo Int |]

您生成一个模板 Haskell 拼接(类似于编译时函数),只需插入行 $(mkFoo) 即可为 data Foo = Foo Int 创建声明>.

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

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

关于haskell - 在 Haskell ("second order Haskell"中生成 Haskell 类型的工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4067731/

相关文章:

Haskell 将时间毫秒转换为 UTCTime

haskell - Haskell 的类型系统可以强制数据管道阶段的正确排序吗?

JAVA 员工类型与数组

julia - 如何在宏中将字符串转换为特定的枚举类型?

ruby - 在 ruby​​ 上,为什么 include 是私有(private)的而 extend 是公共(public)的?

haskell - fmap 的参数太多

haskell - cabal zlib 安装失败

module - 在 OCaml 中使用模块包含

typescript - 当 --module 为 'none' 时,如何使用 @types npm 存储库中的 TypeScript 定义文件

ruby 2.6 : How can I dynamically override instance methods when prepending a module?