Я хотел бы создать функцию, которая принимает некоторые объявления типа Dec (которые я получаю от [d| ... |]) и модифицирую их. Модификации будут зависеть от предыдущих объявлений, поэтому я хотел бы иметь возможность хранить их в карте, скрытой в монаде State - в основном я создаю записи и экземпляры классов и добавляю к ним поля из предыдущих записей. (Таким образом я хочу имитировать ООП, но это, вероятно, не имеет отношения к моему вопросу). Я хотел бы соединить результаты моих вычислений с кодом после того, как я обработаю (и изменю) все объявления.
Я пытался составить StatT с помощью Q всеми возможными способами, но у меня не получается.
Изменить
Моя идея состояла в том, чтобы создать функции, собирающие объявления классов (я знаю, что Haskell не является объектно-ориентированным языком, я читал несколько статей о том, как вы можете кодировать ООП в Haskell, и я пытаюсь реализовать это с помощью Template Haskell как небольшое задание).
Итак, я хотел бы иметь возможность написать что-то вроде этого:
declare [d| class A a where
attr1 :: a -> Int
attr2 :: a -> Int |]
declareInherit [d| class B b where
attr3 :: b -> Int |] ''A
Это кодировка (например, код С++)
struct A{
int attr1;
int attr2;
}
struct B : A {
int attr3;
}
И я хотел бы создать две записи с шаблоном haskell:
data A_data = A_data { attr1' :: Int, attr2' :: Int}
data B_data = B_data { attr1'' :: Int, attr2'' :: Int, attr3'' :: Int}
и экземпляры классов:
instance A A_data where
attr1 = attr1'
attr2 = attr2'
instance A B_data where
attr1 = attr1''
attr2 = attr2''
instance B B_data where
attr3 = attr3''
Вот как работает моя кодировка ОО, но я хотел бы иметь возможность генерировать ее автоматически, а не писать вручную.
У меня была проблема с взаимодействием с DecsQ в функции объявления, возможно, я хотел бы, чтобы она существовала примерно так:
data Env = Env {classes :: Map.Map Name Dec }
type QS a = (StateT Env Q) a
У меня также есть проблема, как запустить вычисления в QS.
Q
— это монада, но вам не нужно использовать свойства ее монады — вместо этого вы можете просто работать с типамиQDec
,QExp
,QType
. - person user2407038   schedule 01.06.2014StateT
сочетается сQ
так же хорошо, как и с любой другой монадой. - person Nikita Volkov   schedule 01.06.2014