0

在我的 Servant/Wai 应用程序中,我想将所有请求从“domain.com”redict 到“www.domain.com”

{-# 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"

我知道这意味着什么,我认为应该已经为 Word8 实现了 Show 类,如果没有,那肯定是有原因的。也许我做错了?

我该如何解决这个问题或以另一种更好的方式来解决这个问题?

更新:

我无法编译:

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

总是有类型不匹配。

4

1 回答 1

4

该模式"www":rest暗示了类型[[Char]],而你需要[Char]。这是您的模式应该是什么:

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

哦。你应该使用Data.ByteString.Char8.unpack(或者Data.ByteString.Lazy.Char8.unpack,如果它是懒惰的)能够匹配字符。否则,您需要使用 ASCII 码'w'代替字符。

于 2016-04-25T10:09:39.503 回答