我想写一个GHC插件,为每个函数“添加一个钩子”。假设我想将addHook
类型的函数Ord a => (a -> b) -> a -> b
应用到每个函数绑定的右侧,转换
foo = [RHS]
到
foo = addHook [RHS]
如果我只想将钩子添加到Int -> Int
类型的函数中,这样可以正常工作,在这种情况下,我使addHook
也具有类型(Int -> Int) -> Int -> Int
,并调用{{1并将其绑定到我的GHC插件中的mkCoreApp [AddHook] [RHS]
。
但是,如果我希望foo
如上所述是多态的,那么addHook
函数的转换后的GHC核心应该看起来像
Int -> Int
请注意,应该附加一些类型信息,但我找不到在插件中构建这些信息的方法,而GHC没有这些信息就会发生恐慌。任何建议都将不胜感激。