【发布时间】:2018-02-03 03:34:57
【问题描述】:
我正在编写一种使用 Haskell 作为宿主语言的编程语言。 (我的语言的解析器、语法、运行时等都是用 Haskell 编写的。)
根据我的 PL 程序中写的内容,在我的语言运行时,我想动态地将不同类型的 Haskell 函数(它们的类型在运行时已知)应用于不同类型的 Haskell 值,其类型在运行时已知.我想以通用的方式应用这些函数,而不必针对每种可能的类型进行区分。基本上我希望我的语言运行时的这一部分在 Haskell 中动态输入。我还想为我的语言编写一个类型检查器。
对我如何做这些事情有什么建议吗?是否有任何用 Haskell 编写的语言示例可以做类似的事情,我可以学习哪些方法?
一个复杂的问题:Haskell 函数和值需要在浮点数上具有多态性,因为我将它们与 Haskell autodiff 库 (https://hackage.haskell.org/package/ad) 一起使用,这要求浮点数具有类型 (Floating a => a)。
我尝试使用 Haskell Data.Dynamic 和 Data.Typeable 库来使函数和值动态化,以便我可以在运行时比较它们的类型并在类型匹配时应用函数,但 Data.Dynamic 似乎不允许多态要转换为动态的函数。文档甚至这样说。我在 Google 上搜索了“Haskell 多态函数动态”,但我没有看到解决此限制的方法。
我宁愿不强制所有 Haskell 函数具有相同的输入/输出类型,我也宁愿不必在 sum 类型中静态列出它们所有可能的类型。也许我可以用某种通用的 Applyable 类型类来解决应用功能问题?还是使用模板 Haskell?这些选项听起来都不是很吸引人。
【问题讨论】:
-
您可以将多态函数包装在新类型下,然后使用
Dynamic。但是,如果您有许多具有不同类型的函数,那么发明所有这些新类型可能会很乏味。
标签: haskell polymorphism dsl dynamic-typing