2016-07-26 7 views
0

Ich versuche, eine einfache Möglichkeit zum Weiterleiten von Anforderungen basierend auf dem Hostnamen zu erstellen. Hier ist die Funktion:Implementieren von Routing in haskell HTTP-Server

handleAccept :: Handle -> String -> IO() 
handleAccept handle hostname = do 
    putStrLn $ "Handling request from " ++ (getMessage hostname) 
    request <- fmap (parseRequest . lines) (hGetContents handle) 
    respond request handle 
    return() 
    where getMessage x 
     | x == "hello" = "hello route" 
     | x == "LOL" = "what's so funny?" 
     | otherwise = x 

hier genannt:

main = withSocketsDo $ do 
    sock <- listenOn (PortNumber 9000) 
    putStrLn "Listening on port 9000" 
    forever $ do 
     (handle, hostname, port) <- accept sock 
     handleAccept handle hostname 
     hClose handle 

Wenn ich zu kompilieren versuchen bekomme ich diesen Fehler:

parse error (possibly incorrect indentation or mismatched brackets) 

an dieser Linie in handleAccept:

where getMessage x 
     | x == "hello" = "hello route" 

Es scheint s ein Problem mit Wachen mit einer Wo-Anweisung sein. Also habe ich diese Dummy-Funktion ausprobiert:

wherePlusGuards :: String -> Bool 
wherePlusGuards x = getX x 
    where getX x 
     | x == "hello" = True 
     | otherwise = False 

Dies kompiliert gut. Ich bin zu glauben, dass das Problem von der Verwendung einer Where-Anweisung und Wachen eine eine do Ausdruck kommt. Warum ist das der Fall? Bitte hilf mir.

Antwort

3

Vergewissern Sie sich, dass die | weiter vertieft wird als die g in getMessage - zB:

import System.IO 

handleAccept :: Handle -> String -> IO() 
handleAccept handle hostname = do 
    putStrLn $ "Handling request from " ++ (getMessage hostname) 
    return() 
    where getMessage x 
      | x == "hello" = "hello route" 
      | x == "LOL" = "what's so funny?" 
      | otherwise = x 

aktualisieren

Diese analysieren nicht richtig:

wherePlusGuards :: String -> Bool 
wherePlusGuards x = getX x 
    where getX x 
     | x == "hello" = True 
     | otherwise = False 

Es ergibt sich die Fehler: parse error (possibly incorrect indentation or mismatched brackets)

Hinweis: Ich verwende keine Tabs.

Vom Haskell2010 Report:

Note 1. A nested context must be further indented than the enclosing context (n > m). If not, L fails, and the compiler should indicate a layout error.

Referenz: https://www.haskell.org/onlinereport/haskell2010/haskellch10.html

Abschnitt 10.3 (Layout), Bemerkung 1.

+0

würde, warum das so wichtig? Wie groß ist die Anzahl der Zeilenumbrüche, nach denen der Parser sucht? – dopatraman

+0

Antwort aktualisiert - Bist du dir sicher, dass 'wherePlusGuards' in Ordnung ist? es analysiert nicht für mich. – ErikR

+0

Referenz aus dem Haskell-Bericht hinzugefügt. – ErikR

Verwandte Themen