在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中实现语言:多态函数的动态类型?,haskell,polymorphism,dsl,dynamic-typing,Haskell,Polymorphism,Dsl,Dynamic Typing,我正在用Haskell作为宿主语言编写一种编程语言。(我的语言的解析器、语法、运行时等都是用Haskell编写的。) 根据PL中的程序编写内容,在语言的运行时,我希望将不同类型的Haskell函数(它们的类型在运行时已知)动态应用于不同类型的Haskell值,这些值的类型在运行时已知。我想以一种通用的方式应用这些函数,而不必对每一种可能的类型进行分类。基本上,我希望语言运行时的这一部分在Haskell中动态键入。我还想为我的语言写一个打字机 对我如何做这两件事有什么建议吗?有没有用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
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^?棱镜
您的每个操作现在都是动态键入的;当应用到正确的参数时,您得到的是
只是
您的结果,而使用错误的参数时,您得到的是什么都没有
。如果您愿意,您可以返回或而不是来获取有关出错原因的更多信息,但这需要在提升函数中使用更多的机制。您可以将多态函数包装在一个新类型下,然后使用动态
。但是,如果您有许多具有不同类型的函数,那么发明所有这些新类型可能会很乏味。