2016-08-04 5 views
1

Jedes Mal, wenn ich diesen Code auszuführen versucht, gibt der Compiler eine 'nicht im Gültigkeitsbereich' Fehler für die Variablen redirectUrlGraphEmail, , aboutContents und staticDir:Wie definiert man eine Variable in einem Tupel?

routes :: [ (String, ServerPart Response)] 
routes = [ 
("graph-fb", seeOther redirectUrlGraphEmail $ toResponse ""), 
("post-fb", seeOther redirectUrlGraphPost $ toResponse ""),    
("about", aboutResponse aboutContents), 
("static", serveDirectory DisableBrowsing [] staticDir)] 

Diese Variablen deklariert von:

staticDir <- getStaticDir 
redirectUrlGraphEmail <- retrieveAuthURL testUrl 
redirectUrlGraphPost <- retrieveAuthURL testPostUrl 
aboutContents <- LazyIO.readFile $ markdownPath ++ "README.md" 
privacyContents <- LazyIO.readFile $ markdownPath ++ "PRIVACY.md" 

aber ich bin mir nicht sicher, wo ich diese Zeilen in das Modul hinzufügen soll. Irgendwelche Hilfe hier?

+0

Können Sie uns ein vollständiges Beispiel in einer Datei zeigen? Es scheint, als ob Sie erwarten, dass die Variablen global oder ähnlich sind. –

Antwort

4

Ich weiß nicht happstack, aber es scheint, dass Ihre Variablen redirectUrlGraphEmail usw. in Ihrem Haupt (oder zumindest in einigen Monaden) definiert sind, oder? Und dann möchten Sie route als separate Funktion in Ihrem Modul definieren.

Die Sache ist, die Variablen, die Sie definieren (die Sie mit <- binden um genau zu sein), um Ihre main in Ihrem main lokal sind, so dass der Rest des Programms keinen Zugang zu ihnen (weshalb der Compiler sagt Ihnen, dass sie nicht im Geltungsbereich sind, wenn Sie versuchen, sie in routes zu verwenden). Wenn Sie davon Gebrauch machen wollen, müssen Sie routes als eine Funktion definieren, sie als Parameter nehmen, so in Ihrem Fall:

routes redirectUrlGraphEmail redirectUrlGraphPost = [ 
("graph-fb", seeOther redirectUrlGraphEmail $ toResponse ""), 
("post-fb", seeOther redirectUrlGraphPost $ toResponse ""),    
("about", aboutResponse aboutContents), 
("static", serveDirectory DisableBrowsing [] staticDir)] 

Und dann von Ihrem main Anruf routes mit den Variablen, die Sie binden haben. Mache ich einen Sinn?

+0

Ja, das macht sehr viel Sinn für mich. Danke für Ihre Erklärung! Eine andere Frage ist hier im Hauptmodul, die Art, wie ich 'routes' nenne' (map (\ (a, b) -> dir ab) $ routes) ', die die Funktion' dir' auf jedes Tupel in 'Routen abbildet '. Und 'dir' nimmt zwei Elemente im Tupel als Variablen auf. Wie kann ich das mit dem Aufruf von 'routes' in main mit Variablen kombinieren, die ich gebunden habe? –

+0

Wenn ich Ihre Frage richtig verstanden habe, können Sie einfach 'routes' auf ihre Argumente anwenden, so dass Sie einfach' map (\ (a, b) -> dir a b) $ routes redirectUrlGraphEmail redirectUrlGraphPost ... 'schreiben können. Beachten Sie, dass Sie in Ihrer ursprünglichen Formulierung, die '$' nicht brauchen, schreiben 'map (\ (a, b) -> dir a b) Routen wäre in Ordnung gewesen;) – villou24

+0

Ich sehe! Muss ich dann diese Variablen in meiner Routenfunktion hinzufügen? wie 'Routen :: [(String, ServerPart Response)] Routen staticDir redirectUrlGraphEmail redirectUrlGraphPost aboutContents privacyContents = [ ("Graph-fb", seeOther redirectUrlGraphEmail $ toResponse ""), ("post-fb", seeOther redirectUrlGraphPost $ toResponse ""), ("about", aboutResponse aboutContents), ("static", serveDirectory DisableBrowsing [] staticDir)] ' –

Verwandte Themen