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.
würde, warum das so wichtig? Wie groß ist die Anzahl der Zeilenumbrüche, nach denen der Parser sucht? – dopatraman
Antwort aktualisiert - Bist du dir sicher, dass 'wherePlusGuards' in Ordnung ist? es analysiert nicht für mich. – ErikR
Referenz aus dem Haskell-Bericht hinzugefügt. – ErikR