Voglio dichiarare una typeclass che ha alcune funzioni implementate che utilizzano un valore costante non implementato (table
):Un modo per dichiarare un valore costante in una classe di tipo
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 = ?"
L'idea è semplice: voglio ottenere i byId
(e altre funzioni simili) disponibili istanziando questo typeclass specificando solo il table
:
instance StdQueries SomeType where
table = "the_constant_value_for_this_type"
Ma il compilatore continua a lamentarsi con il seguente messaggio:
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'
Esistono soluzioni per questo tipo di problema? Può ingannare con l'aiuto newtype
o qualcosa del genere?
Non c'è molto sbagliato in questo, molte classi di tipi lo fanno in questo modo. – leftaroundabout
si prega di formattare il codice per renderlo più leggibile; inoltre, funziona davvero? sembra che tu stia rendendo 'table' una funzione adesso, ma non la stai usando in questo modo nella parte' where sql = ... ' Il tipo di tabella – ErikR
è 'a -> String' e non' String', quindi come lo si concatena? – Satvik