在Haskell中实现语言:多态函数的动态类型?

在Haskell中实现语言:多态函数的动态类型?,haskell,polymorphism,dsl,dynamic-typing,Haskell,Polymorphism,Dsl,Dynamic Typing,我正在用Haskell作为宿主语言编写一种编程语言。(我的语言的解析器、语法、运行时等都是用Haskell编写的。) 根据PL中的程序编写内容,在语言的运行时,我希望将不同类型的Haskell函数(它们的类型在运行时已知)动态应用于不同类型的Haskell值,这些值的类型在运行时已知。我想以一种通用的方式应用这些函数,而不必对每一种可能的类型进行分类。基本上,我希望语言运行时的这一部分在Haskell中动态键入。我还想为我的语言写一个打字机 对我如何做这两件事有什么建议吗?有没有用Haskell

我正在用Haskell作为宿主语言编写一种编程语言。(我的语言的解析器、语法、运行时等都是用Haskell编写的。)

根据PL中的程序编写内容,在语言的运行时,我希望将不同类型的Haskell函数(它们的类型在运行时已知)动态应用于不同类型的Haskell值,这些值的类型在运行时已知。我想以一种通用的方式应用这些函数,而不必对每一种可能的类型进行分类。基本上,我希望语言运行时的这一部分在Haskell中动态键入。我还想为我的语言写一个打字机

对我如何做这两件事有什么建议吗?有没有用Haskell编写的类似语言的例子,我可以从他们的方法中学习

一个复杂问题是:Haskell函数和值需要在float上具有多态性,因为我将它们与Haskell autodiff库()一起使用,这要求float具有类型(Floating a=>a)

我尝试使用Haskell Data.Dynamic和Data.Typeable库使函数和值成为动态的,这样我就可以在运行时比较它们的类型,并在类型匹配时应用函数,但Data.Dynamic似乎不允许将多态函数强制转换为动态函数。文件甚至说了这一点。我在谷歌上搜索了“Haskell多态函数动态”,但我没有找到绕过这个限制的方法


我不希望强制所有Haskell函数都具有相同的输入/输出类型,也不希望在sum类型中静态列出所有可能的类型。也许我可以用某种通用的可应用类型类来解决应用函数的问题?还是使用模板Haskell?所有这些选择听起来都不是很吸引人

在不了解您的问题领域的情况下很难回答这个问题,但这里有一种方法可能有效:

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

  • 创建联合类型
    FooBar=data-Dfoo-Foo | Dbar-Bar
    和关联的
    \u-Foo
    \u-Bar

  • 编写一系列函数,使用步骤2中定义的棱镜将
    Foo
    Bar
    函数提升到
    FooBar
    类型

  • 比如说,

      elevate2 :: Prism' b a -> (a -> a -> a) -> b -> b -> Maybe b
      elevate2 prism f arg1 arg2 = f <$> arg1 ^? prism <*> arg2 ^? prism
    
    elevate2::Prism'b a->(a->a->a)-->b->b->可能是b
    提升2棱镜f arg1 arg2=f arg1^?棱镜arg2^?棱镜
    

    您的每个操作现在都是动态键入的;当应用到正确的参数时,您得到的是
    只是
    您的结果,而使用错误的参数时,您得到的是
    什么都没有
    。如果您愿意,您可以返回
    而不是
    来获取有关出错原因的更多信息,但这需要在提升函数中使用更多的机制。

    您可以将多态函数包装在一个新类型下,然后使用
    动态
    。但是,如果您有许多具有不同类型的函数,那么发明所有这些新类型可能会很乏味。