假设我有一个任意模块
module Foo where
foo :: Moo -> Goo
bar :: Car -> Far
baz :: Can -> Haz
其中foo
、bar
和baz
正确实现等。
我想将此模块具体化为自动生成的数据类型和相应的对象:
import Foo (Moo, Goo, Car, Far, Can, Haz)
import qualified Foo
data FooModule = Foo
{ foo :: Moo -> Goo
, bar :: Car -> Far
, baz :: Can -> Haz
}
_Foo_ = Foo
{ foo = Foo.foo
, bar = Foo.bar
, baz = Foo.baz
}
名称必须与原始模块完全相同。
我可以手动完成,但这非常乏味,所以我想编写一些代码来为我执行此任务。
我不太确定如何处理这样的任务。模板 Haskell 是否提供了检查模块的方法?我应该挂钩一些 GHC api 吗?或者我是否也可以使用更特别的方法,例如刮黑线鳕页面?