【问题标题】:Implementing a language in Haskell: dynamic typing for polymorphic functions? [closed]在 Haskell 中实现一种语言:多态函数的动态类型? [关闭]
【发布时间】: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


【解决方案1】:

如果不进一步了解您的问题领域,很难回答这个问题,但这里有一种可能有效的方法:

  1. 将您的类型和函数分组到模块中:查看您的应用程序是否处理 Foo 类型并具有一组相应的函数来操作它们,以及 Bar 类型是否具有大部分不相交的函数集。一个真实的例子可能是数值函数和字符串函数。有一些交叉,但大多数是具有不同功能的独立类型。尝试编写这些函数,使所有FooBar 参数都在末尾,所以更喜欢f :: String -> Foo -> Foo 而不是f :: Foo -> String -> Foo

  2. 创建联合类型FooBar = data Dfoo Foo | Dbar Bar并关联prisms_Foo_Bar

  3. 使用您在步骤 2 中定义的棱镜,编写一系列函数以将 FooBar 函数提升为 FooBar 类型。

例如,

  elevate2 :: Prism' b a -> (a -> a -> a) -> b -> b -> Maybe b
  elevate2 prism f arg1 arg2 = f <$> arg1 ^? prism <*> arg2 ^? prism

您的每个操作现在都是动态类型的;当应用于正确的参数时,你会得到Just 你的结果,而使用错误的参数你会得到Nothing。如果您愿意,可以返回 Either 而不是 Maybe 以获取有关问题所在的更多信息,但这需要在您的海拔函数中使用更多机器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    相关资源
    最近更新 更多