gpt4 book ai didi

haskell - 为什么我不能从 Yesod 中的处理程序返回 ByteString?

转载 作者:行者123 更新时间:2023-12-04 17:30:49 25 4
gpt4 key购买 nike

我正在尝试返回 ByteString来自我的 Handler Yesod中的功能:

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有一个 ToTypedContent实例?

最佳答案

ToTypedContent类(class)描述了content-type是数据。因此,具有关联内容类型的类型(例如 TextValue (JSON) 的 UTF 8)可以具有自然的 ToTypedContent实例。
ByteString 的问题是它描述了任何二进制数据——你的 ByteString可以是 PNG、JPEG 或任何内容,因此不清楚要为其提供什么内容类型。

如果你真的只想返回二进制数据,octet-stream内容类型合适:

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

但如果可能,您应该尝试更好的内容类型(例如 image/jpeg 用于 JPEG)。

在这种情况下,您可以使用 TypedContent如上手动,或编写您自己的 ToTypedContent 实例对于新类型超过 ByteString
newtype Jpeg = Jpeg ByteString deriving (Show, ToContent)

instance ToTypedContent Jpeg where
toTypedContent h = TypedContent "image/jpeg" (toContent h)

关于haskell - 为什么我不能从 Yesod 中的处理程序返回 ByteString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47838113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com