Ich arbeite an einer Webapp mit Happstack und ich schreibe Code, um meine Typen in MongoDB zu speichern. Ich hatte das Gefühl, meinen Code etwas zu verkürzen, indem ich den Code in eine Typklasse einfügte, so dass ich denselben Code zum Lesen und Schreiben in die Datenbank für verschiedene Typen verwenden konnte. Etwas wie folgt aus:Wert in typeclass ohne Typ variable constraint
class DatabaseType a where
toDoc :: a -> Document
fromDoc :: Document -> a
saveCollection :: Text
getFromDatabase :: (MonadIO m) => Pipe -> Text -> Value -> m a
getFromDatabase pipe field value = ...
...
Nun ist das Problem hier ist die saveCollection
, da es eine der Variablen vom Typ GHC nicht verwendet wird es jedoch nicht zulassen, kompilieren es um die Datenbankfunktionen sehr wichtig ist (wie getFromDatabase
) damit sie wissen, in welcher Sammlung sie speichern möchten.
Frage ist, wie man einen Wert in einer Typklasse hat, die nicht durch die Typvariablen verbunden ist.
Dies ist in der Tat die idiomatische Lösung. (+1) Dennoch habe ich die Verwendung von "Proxy A" nie vollständig gekauft, auch wenn dies sehr populär geworden ist. Ich würde erwägen, z.B. '[a]' anstelle von 'Proxy a' zu verschleiern: Wenn der beabsichtigte Wert irrelevant ist, und nur der Typ zählt, würde ich lieber einen expliziten' Proxy a' übergeben. Hoffentlich werden GHC 8 und Explicit Type Args Proxies wegwischen. – chi
@chi, stimme ich normalerweise zu.Es kann jedoch sehr praktisch sein, einen Singleton als Proxy zu verwenden. Wenn ich 'assoziieren :: Natty x -> Natty y -> Proxy z -> (x: + y): + z: ~: x: + (y: + z)' und ich habe Singletons, die drei natürliche Zahlen darstellen, Ich kann sie einfach weitergeben, ohne vorher die dritte in einen Proxy umzuwandeln. – dfeuer