2017-12-15 18 views
4

私はイェソドの私Handler関数からByteStringを返すようにしようとしている:YesodのハンドラからByteStringを返すことができないのはなぜですか?

getHomeR :: Handler ByteString 
getHomeR = return "foo" 

が、私はこのエラーを取得しています:

/Users/maximiliantagher/Documents/Mercury/hs/mercury-web-backend/src/Application.hs:48:1: error: 
    • No instance for (ToTypedContent ByteString) 
     arising from a use of ‘yesodRunner’ 
    • In the expression: 
     yesodRunner getHomeR env1404_axwe (Just HomeR) req1404_axwf 
     In a case alternative: 
      "GET" 
      -> yesodRunner getHomeR env1404_axwe (Just HomeR) req1404_axwf 
     In the expression: 
     case Network.Wai.Internal.requestMethod req1404_axwf of { 
      "GET" 
      -> yesodRunner getHomeR env1404_axwe (Just HomeR) req1404_axwf 
      _ -> yesodRunner 
       (void badMethod) env1404_axwe (Just HomeR) req1404_axwf } 

なぜ、この出来事と、なぜByteStringが持っていないですa ToTypedContentインスタンス?

答えて

7

ToTypedContentクラスは、content-typeがデータの内容を記述します。コンテンツタイプが関連付けられているタイプ(TextまたはValue(JSON)のUTF8など)は、自然なToTypedContentインスタンスを持つことができます。

ByteStringの問題は、ByteStringがPNG、JPEGなどのバイナリデータを記述しているため、どのようなコンテンツタイプを指定するのか不明です。

あなたは本当にただのバイナリデータを返したい場合は、octet-streamコンテンツタイプが適切である:

getHomeR :: Handler TypedContent 
getHomeR = return $ TypedContent typeOctet $ toContent ("x" :: ByteString) 

でも可能(例えばimage/jpeg JPEGのための)場合は、より良いコンテンツタイプのために試してみてください。その場合

、あなたは上記のように手動でTypedContentを使用するか、またはByteString

newtype Jpeg = Jpeg ByteString deriving (Show, ToContent) 

instance ToTypedContent Jpeg where 
    toTypedContent h = TypedContent "image/jpeg" (toContent h) 
上のnewtypeため ToTypedContentの独自のインスタンスを作成することができますいずれか
関連する問題