我的主要问题是:在某些Haskell AST中,我可以确定可用声明列表及其类型吗?我正在尝试构建一个编辑器,允许用户显示所有可用的编辑,例如插入函数和/或可以在任何点使用或插入的其他声明值。它还会禁止语法错误以及类型错误。 (也就是说,它将是一个语义结构编辑器,我也会使用类型检查器来确保编辑部分在这种情况下有意义,Haskell)。
我的问题的第二部分是:一旦我有了这个列表,给定一个特定的表达式或函数或关注一块AST(使用Lens
),我怎么能根据可能的内容过滤列表替换或适合特定焦点的AST片段(无论是通过为函数提供参数,还是它的值,只是" as-is")。也许我需要在这里添加一些具体的例子......类似于:" Haskell,哪些声明可以应用(用于函数)和/或放在yay x y z = (x + y - z) * _
的洞中?"然后,如果有一个表达式number2 :: Num a => a ; number2 = 23
,它会将它放在列表中,以及上下文中可用的函数,以及来自Num
本身的函数,例如(+) :: Num a => a -> a -> a
,{{ 1}},以及导致类型匹配的任何其他声明,例如(*) :: Num a => a -> a -> a
等等。
更多详细信息如下:
我在很长一段时间内对这个领域进行过一些研究:查看并使用了Num a => a
,hint
和Language.Haskell.Exts
。还看了Control.Lens
。 Dynamic
与我的问题的后半部分相关。我还看了很多项目,包括Conal Elliott" Semantic Editing Combinators",Paul Chiusano的Unison系统以及Clojure和Lisp中的很多内容。同样。
所以,我知道我可以获得一个模块的导出列表,其中提示为Control.Lens
,我可以将其强制转移到[String]
,我想(可能?),但我是我不知道如何获得子功能声明及其类型。 (也许我可以使用AST在该范围内获取声明并将它们放在String中的自己的模块中并通过使用提示获取顶级声明来将它们拉入来?这样可以工作但感觉很麻烦和麻烦)
我可以使用[Dynamic]
中的(:~:)
进行"命题平等" (即类型检查?)两个术语,但我实际需要做的是看一个术语是否可以匹配到源/ AST中的位置(我使用镜头和棱镜来关注AST的那些部分给出了一些论点。某种部分类型检查或结果类型检查?因为我可能关注的事情很可能是一个功能,我可能需要保持相同的意识。
我觉得这可能和伊德里斯非常相似。术语搜索,虽然我没有考虑到这一点的来源,但我不确定这是否只能用依赖类型的语言来实现。
任何帮助都会很棒。
答案 0 :(得分:0)
看起来我回答了我自己的问题,所以我将在这里正式提出。
我的问题第一部分的答案可以在Reflection
库的hint
模块中找到。我知道我可以获得一个[String]
这些模块的列表,但是那里有一个可以使用的函数,其类型为:getModuleExports :: MonadInterpreter m => ModuleName -> m [ModuleElem]
,很可能是我追求的那种东西。这是因为hint
提供了对大部分GHC API的访问。它还提供了一些查找函数,然后我可以使用它们来获取这些顶级术语的类型。
https://github.com/mvdan/hint/blob/master/src/Hint/Reflection.hs#L30
此外,模板Haskell提供了我感兴趣的功能的一些,我可能最终会使用相当多的东西来构建我的功能,或者至少是一组镜头对于正在考虑的代码(/文本)使用的任何语法。
就问题的第二部分而言,我仍然没有特别好的答案,所以我的第一次尝试是在查找函数的输出上使用一些String
munging,看看我是什么能做到。