Chcę zadeklarować typeclass że ma kilka funkcji zaimplementowanych które wykorzystują ZAIMPLEMENTOWANE stałą wartość (table
):Sposób zadeklarować stałą wartość w klasie typu
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 = ?"
Pomysł jest prosty: chcę uzyskać byId
(i inne podobne funkcje) dostępnego przez instancji tej typeclass określając tylko table
:
instance StdQueries SomeType where
table = "the_constant_value_for_this_type"
Ale kompilator skarży utrzymuje z następującym komunikatem:
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'
Czy są jakieś rozwiązania tego rodzaju problemu? Czy można oszukać przy pomocy newtype
pomocy lub czegoś w tym stylu?
Nie ma w tym nic złego, wiele klas typu robi to w ten sposób. – leftaroundabout
proszę sformatować kod, aby był bardziej czytelny; także, czy to naprawdę działa? wygląda na to, że teraz tworzysz 'table', ale nie używasz go w ten sposób w części' where sql = ... '. – ErikR
typ tabeli to 'a -> String', a nie' String', więc jak się je łączy? – Satvik