Я хочу объявить класс типов, в котором есть некоторые реализованные функции, использующие нереализованное постоянное значение (table
):
class FromRow a => StdQueries a where
table :: String
byId :: Int -> QueryM (Maybe a)
byId = fmap listToMaybe . queryM sql . Only
where sql = read $ "SELECT * FROM " ++ table ++ " WHERE id = ?"
Идея проста: я хочу получить доступ к byId
(и другим подобным функциям), создав экземпляр этого класса типов, указав только table
:
instance StdQueries SomeType where
table = "the_constant_value_for_this_type"
Но компилятор продолжает жаловаться на следующее сообщение:
The class method `table'
mentions none of the type variables of the class StdQueries a
When checking the class method: table :: String
In the class declaration for `StdQueries'
Есть ли решения такой проблемы? Может поможет обманка с newtype
или что-то в этом роде?