2016-04-25 15 views
1

In meinem Diener/Wai app Ich möchte redict alle Anfragen von "domain.com" auf "www.domain.com"Unable Mustervergleich auf Word8

{-# LANGUAGE OverloadedStrings #-} 
--....... 

app :: Application 
app req respond = do 
    case requestHeaderHost req of 
    Just host -> do 
     case BS.unpack host of 
     "www":rest -> respond =<< redirect' HttpTp.status302 [] "domain.com" 

     _ -> undefined 

    Nothing -> undefined 

Der Fehler ist

zu tun
No instance for (Data.String.IsString GHC.Word.Word8) 
    arising from the literal ‘"www"’ 
In the pattern: "www" 

Ich weiß, was es bedeutet, und ich denke, dass die Klasse Show hätte für Word8 implementiert werden müssen, und wenn nicht, muss es einen Grund geben. Vielleicht mache ich es falsch?

Wie kann ich das beheben oder es noch besser machen?

Update:

Ich kann es nicht zu kompilieren:

-- 1 
Just host -> do 
    case BS.isPrefixOf (BS.pack $ show "www") host of 

-- 2 
Just host -> do 
    case Text.isPrefixOf (Text.pack $ show "www") host of 

-- 3 
Just host -> do 
    case DL.isPrefixOf "www" host of 

Es gibt immer Mismatch geben.

+0

Vielleicht wird dies helfen (wenn es tut, bedenken Sie, dass das Einfügen von Fehlermeldungen in Google-Suche Wunder bewirken kann): http://StackOverflow.com/Questions/3753445/Haskell-A-Problem-mit-dem- einfachsten -wai-Beispiel – Kapol

Antwort

3

Das Muster "www":rest impliziert den Typ [[Char]], während Sie [Char] benötigen. Hier ist, was Ihr Muster sein sollte:

'w':'w':'w':rest 

Oh. Und Sie sollten Data.ByteString.Char8.unpack (oder Data.ByteString.Lazy.Char8.unpack, wenn es faul ist) verwenden, um mit Zeichen übereinstimmen zu können. Andernfalls müssen Sie anstelle des Zeichens den ASCII-Code 'w' verwenden.

+0

@ user6250601 Scheint so, als ob dein ByteString streng ist. Verwenden Sie 'Data.ByteString.Char8.unpack' anstelle von' Data.ByteString.Lazy.Char8.unpack'. –

+0

@ user6250601 Achten Sie genau auf die Modulnamen und -typen. Die Typen 'Data.ByteString.ByteString' und' Data.ByteString.Lazy.ByteString' sind unterschiedlich! Ihre Fehler werden dadurch verursacht, dass Sie die API "Data.ByteString.Lazy" für eine strikte Bytefolge verwenden, während nur "Data.ByteString" und "Data.ByteString.Char8" darauf anwendbar sind. –