Załóżmy, że mam dowolny modułzreifikować moduł do rekordu
module Foo where
foo :: Moo -> Goo
bar :: Car -> Far
baz :: Can -> Haz
gdzie foo
, bar
i baz
są prawidłowo wykonywane, itp
Chciałbym zreifikować tego modułu w produkt automatycznie -produkowany typ danych i odpowiedni obiekt:
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
}
Nazwy muszą być dokładnie takie same jak oryginalny moduł.
Mogłem to zrobić ręcznie, ale to bardzo żmudne, więc chciałbym napisać kod, aby wykonać to zadanie dla mnie.
Nie jestem pewien, jak podejść do takiego zadania. Czy szablon Haskell umożliwia sprawdzanie modułów? Czy powinienem podłączyć się do jakiegoś api GHC? Czy mam się dobrze z bardziej ad-hoc podejście, takie jak skrobanie stron plamiaka?
Czy można użyć polecenia 'haskell-src-exts' do przeanalizowania źródła modułu, a następnie utworzyć z niego typ danych i wyświetlić nowy plik źródłowy? –
haskell-src-exts to świetny pomysł, ale parsowanie źródła niekoniecznie wystarczy. Na przykład źródło [Data.Map] (http://hackage.haskell.org/packages/archive/containers/0.5.0.0/doc/html/src/Data-Map.html) po prostu ponownie eksportuje dane. Map.Lazy z kilkoma dodatkowymi rzeczami. Potrzebuję przejściowego zamknięcia wszystkich eksportów, które dany moduł faktycznie eksportuje. Byłoby również miło wyodrębnić dane modułu bez konieczności sprawdzania źródła. –