Допустим, нам нужно указать названия полей базы данных, откуда будет грузиться / куда будет сохраняться объекты класса. Это можно сделать примерно так (там еще нужна аннотация или ключик для доступа через рефлексию/аннотации к приватным членам):
public @interface DBTable { String value; }
public @interface DBField { String value; }
@DBTable("forum_users") class User
{
@DBField("email") String email;
@DBField("f_name") String first_name;
@DBField("l_name") String last_name;
};
class DBAccess
{
public void Load(Object o, int key) { ... }
public void Save(Object o, int key) { ... }
}
Функциям Load и Save не нужно указывать названия таблиц (и полей), куда сохранять объекты — они их узнают сами из аннотаций.
Теперь вопросы:
1. Делается ли это на хаскеле (только без извращений типа передачи каждой буквы строки «f_name» отдельным фантомным типом или тайпклассом)?
2. Делается ли это готовой библиотечкой на template haskell?
P.S. Вам не кажется, что это чем-то напоминает зависимые типы?
P.S.S. Для тех, кто хочет, что ВСЕ проверялось во время компиляции: члены аннотации могут быть не только строками, но и перечислениями. Т.е. внешним скриптом, исходя из схемы базы данных, можно сгенерить соответствующие таблицам БД enum-ы и ловить любую опечатку в названии таблицы или ее поля (пример приводить лень, сорри).