2016-04-25 12 views
1

В моих Слугах/Wai приложение, которое я хочу redict всех запросов от «domain.com» до «www.domain.com»Невозможно сделать сопоставление с образцом на 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 

Ошибка

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

Я знаю, что это значит, и я думаю, что класс Show должен был быть реализован для Word8, а если нет, то должна быть причина. Может быть, я делаю это неправильно?

Как я могу исправить это или сделать это еще лучше?

Update:

Я не могу получить его для компиляции:

-- 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 

Там всегда тип несоответствия.

+0

Возможно, это поможет (если это так, имейте в виду, что вставка сообщений об ошибках в поиск Google может творить чудеса): http://stackoverflow.com/questions/3753445/haskell-a-problem-with-the-simplest -wai-example – Kapol

ответ

3

Образец "www":rest подразумевает тип [[Char]], в то время как вам необходимо [Char]. Вот, каков ваш шаблон:

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

Ох. И вы должны использовать Data.ByteString.Char8.unpack (или Data.ByteString.Lazy.Char8.unpack, если он ленив), чтобы иметь возможность сопоставлять символы. В противном случае вам нужно использовать код ASCII 'w' вместо символа.

+0

@ user6250601 Кажется, что ваш ByteString является строгим. Используйте 'Data.ByteString.Char8.unpack' вместо' Data.ByteString.Lazy.Char8.unpack'. –

+0

@ user6250601 Обратите внимание на имена и типы модулей. Типы 'Data.ByteString.ByteString' и' Data.ByteString.Lazy.ByteString' отличаются друг от друга! Ваши ошибки вызваны использованием API 'Data.ByteString.Lazy' для строгой байтовой строки, в то время как к ним применимы только' Data.ByteString' и 'Data.ByteString.Char8'. –