函数搜索适用于Haskell AST透镜片的适用类型
我的主要问题是:在一些Haskell AST中,是否有一种方法可以确定可用声明的列表及其类型?我正在尝试构建一个编辑器,允许用户显示所有可用的适当编辑,例如插入函数和/或其他可在任何点使用或插入的声明值。它还不允许语法错误和类型错误。(也就是说,它将是一个语义结构编辑器,我还将使用typechecker来确保编辑片段在本例中对Haskell有意义) 我的问题的第二部分是:一旦我有了这个列表,给定一个特定的表达式或函数,或者关注AST片段(使用函数搜索适用于Haskell AST透镜片的适用类型,haskell,Haskell,我的主要问题是:在一些Haskell AST中,是否有一种方法可以确定可用声明的列表及其类型?我正在尝试构建一个编辑器,允许用户显示所有可用的适当编辑,例如插入函数和/或其他可在任何点使用或插入的声明值。它还不允许语法错误和类型错误。(也就是说,它将是一个语义结构编辑器,我还将使用typechecker来确保编辑片段在本例中对Haskell有意义) 我的问题的第二部分是:一旦我有了这个列表,给定一个特定的表达式或函数,或者关注AST片段(使用Lens),我如何根据可能替换或适合这个特定关注AST
Lens
),我如何根据可能替换或适合这个特定关注AST片段的内容来过滤列表(无论是通过向函数提供参数,还是如果它是一个值,就像“原样”). 也许我需要在这里添加一些具体的例子。。。类似于:“Haskell,哪些声明可能被应用(对于函数)和/或放在yay x y z=(x+y-z)*\uu
?”然后如果有一个表达式number2::Num a=>a;number2=23
它将把它以及上下文中可用的函数,以及来自Num
本身的函数,例如(+)::Num a=>a->a
,(*)::Num a=>a->a
,都放在列表中,以及导致匹配类型的任何其他声明,例如numa=>a
等
详情如下:
在相当长的一段时间里,我对这个领域做了相当多的研究:查看并使用了提示
,语言.Haskell.Exts
和控件.Lens
。还研究了动态<代码>控制。镜头
与我问题的后半部分相关。我还研究了很多项目,包括Conal Elliott的“语义编辑组合器”,Paul Chiusano的Unison系统,以及Clojure和Lisp中的很多东西
所以,我知道我可以得到一个模块的导出列表,提示为[String]
,我可以将其强制为[Dynamic]
,我想(可能吧?),但我不确定如何得到子函数声明及其类型。(也许我可以使用AST获取该范围内的声明,并将它们以字符串形式放在它们自己的模块中,然后通过使用hint获取顶级声明将它们拉进来?这可能会起作用,但会让人感觉既麻烦又烦琐)
我可以使用(:~:)
fromData.Typeable
对两个术语进行“命题相等”(即类型检查?),但我实际需要做的是,在给定一些参数的情况下,看看一个术语是否可以匹配到源/AST中的某个位置(我使用透镜和棱镜来关注AST的这些部分)。某种部分类型检查,或结果类型检查?因为我关注的可能是一个函数,我可能需要保持相同的算术
我觉得这可能与Idris的术语搜索非常相似,尽管我还没有研究它的源代码,我也不确定这是否只有在依赖类型的语言中才可能
任何帮助都会很好。看起来我已经回答了我自己的问题,所以我将在这里正式回答
我问题第一部分的答案可以在hint
库的Reflection
模块中找到。我知道我可以得到这些模块的一个列表,但是其中有一个函数可以使用,它的类型是:getModuleExports::MonadInterpreter m=>ModuleName->m[ModuleLem]
,很可能就是我要找的那种类型。这是因为hint
提供了对大部分GHC API的访问。它还提供了一些查找函数,我可以使用这些函数来获取这些顶级术语的类型
此外,Template Haskell提供了一些我感兴趣的功能,我可能最终会使用其中相当一部分来构建我的函数,或者至少是一组透镜,用于考虑中的代码(/text)正在使用的任何语法
关于问题的第二部分,我仍然没有一个特别好的答案,因此我的第一次尝试是使用一些字符串对查找函数的输出进行搜索,看看我能做些什么。任何可能的答案都完全取决于您选择如何表示Haskell术语和类型;除非您也在构建自己的Haskell typechecker(您必须这样做才能基于动态
),否则GHC api使用的相同表示可能是一个明显的选择。GHCAPI还允许您根据类型查找声明。在那之后,第二个问题的答案完全取决于您希望您的编辑器尝试找到潜在答案的难度(您是否尝试将目标类型与范围中的每个声明统一起来?可能不会)我使用的是语言.Haskell.Exts
,如果我没有说清楚,很抱歉。这是GHCI API表示。(假设我理解你所说的GHC API)。我不是基于Dynamic
,我只是想Dynamic
可能会让我在一个列表中获取一大堆表达式和/或函数(因为这是创建异构列表的最简单方法)。是的,我想用范围内的每个声明统一目标类型,如果可能的话,首先是“最近的”范围。更新:对不起,现在我明白你指的是GHC套餐。对不起,谢谢。说清楚点,我是说。我之所以说“可能不会”,是因为统一两个碰巧在范围内的随机类型不太可能成功,但可能会非常昂贵;这可能会严重影响程序的可用性。无程序(IDE,典型