2015-04-08 3 views
6

Ich habe ein Modul codiert und funktioniert, aber ich kann nicht verwalten, um zwei Funktionssignaturen für sie eingeben, weil ich die TypeFamilies Erweiterung für das Modul aktivieren muss, und wenn ich mach das, es baut nicht mehr auf.aktiviert TypFamilies macht den Code nicht mehr zu bauen

Für eine von ihnen brauche ich TypeFamilies, weil es persisent/esqueleto functions verwendet.

Der richtige Typ wäre, glaube ich:

getByIds :: (PersistEntityBackend a ~ SqlBackend) => 
    EntityField a (Key a) -> [Key a] -> SqlPersistM [Entity a] 

(ghc schlägt eine allgemeinere Signatur)

Der andere nutzt hsqml.

ghc schlägt vor, diese Unterschrift, aber ich denke, es könnte vereinfacht werden:

prop :: forall tr b. 
      (Marshal tr, Typeable b, MarshalMode tr ICanReturnTo() ~ Yes) => 
      String -> (b -> tr) -> Member (GetObjType (ObjRef b)) 

Unterm Strich ist, dass ohne TypeFamilies ich nicht jene Unterschriften schreiben kann. In dem Moment, in dem ich TypeFamilies aktiviere, wird der Code jedoch nicht erstellt, und ich verstehe nicht warum. Der Fehler sieht aus, dass einige polymorphe Funktionen plötzlich monomorph wurden.

Die Fehlerausgabe ist relativ lang, Sie finden sie here.

Ich habe TypeFamilies in mehreren anderen Modulen der Anwendung ermöglicht, ohne Probleme, und das ermöglicht es mir Signaturen sowohl die ohne Probleme SqlBackend & ICanReturnTo Einschränkungen verwenden zu schreiben.

Gibt es etwas falsch mit diesem Modul, das verhindert, dass es mit TypeFamilies bauen? Oder sollte ich noch eine Erweiterung aktivieren, um es zu beheben? Ich habe nicht erwartet, dass diese Erweiterung nur die Kompilierung unterbrechen würde.

+0

Was ist los mit GHC generalisiertem Typ? Wenn es auf GHC funktioniert, sollte es gut kompilieren. – AJFarmar

Antwort

9

Der Typ Gleichheitsbedingung ~ kann nur ausgeschrieben werden, wenn Sie entweder TypeFamilies oder GADTs aktiviert haben.

Wenn Sie jedoch TypeFamilies oder GADTs aktivieren, wird auch MonoLocalBinds. aktiviert. Wie der Name sagt, wird die Verallgemeinerung von lokal definierten Variablen deaktiviert.

Wenn MonoLocalBinds verhindert, dass Code kompiliert wird, sollten Sie entweder die generalisierten Typ-Signaturen ausschreiben oder solche Locals in Top-Level-Definitionen ausschließen. Manchmal ist es schwierig, die generalisierten Typen zu schreiben; In solchen Fällen können Sie versuchen, GHCi abzufragen, oder Sie können NoMonomorphismRestriction aktivieren, unannotated Top-Level-Definitionen schreiben und dann die abgeleiteten Typen betrachten.

+3

'NoMonoLocalBinds' macht es tatsächlich zu bauen. Ich kannte das nicht. Im Moment verstehe ich den Unterschied zwischen "NoMonomorphismRestriction" und "NoMonomorphismRestriction" nicht, obwohl sie scheinbar fast das gleiche sind. Wie auch immer ich weiß, wo ich jetzt suchen soll, danke! –

+0

Ich habe total vergessen, dass es auch ein 'NoMonoLocalBinds'-Flag gibt. –

+1

Ja, aber https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/other-type-extensions.html#mono-local-binds sagt "Sie können es mit' -XNoMonoLocalBinds' wieder ausschalten aber die Art der Inferenz wird weniger vorhersagbar, wenn Sie das tun. (Lesen Sie die Papiere!) "- deshalb werde ich eher die lokalen Variablen kommentieren, wie Sie vorgeschlagen haben. –

Verwandte Themen