我正在尝试使用Yesod 1.2中的新selectRep
函数,但是我无法让json响应起作用。
instance ToJSON (Entity Feed) where
toJSON (Entity uid (Feed url lastUpdated)) = object
[ "id" .= uid
, "url" .= url
, "lastUpdated" .= lastUpdated
]
getFeedByIdR :: FeedId -> Handler TypedContent
getFeedByIdR feedId = do
feed <- runDB $ get404 feedId
selectRep $ do
provideRep $ return $ toJSON (Entity feedId feed)
我从上面的代码得到的错误是
Handler/Feed.hs:23:31:
Overlapping instances for ToJSON (Entity Feed)
arising from a use of `toJSON'
Matching instances:
instance ToJSON e => ToJSON (Entity e)
-- Defined in `persistent-1.2.0.1:Database.Persist.Class.PersistEntity'
instance ToJSON (Entity Feed) -- Defined at Handler/Feed.hs:5:10
In the second argument of `($)', namely
`toJSON (Entity feedId feed)'
In the second argument of `($)', namely
`return $ toJSON (Entity feedId feed)'
In a stmt of a 'do' block:
provideRep $ return $ toJSON (Entity feedId feed)
似乎持久性确实为ToJSON (Entity e)
here提供了一个实例,但是我能以某种方式使用我的ToJSON (Entity Feed)
吗?
答案 0 :(得分:5)
如果您为Feed
提供实例,则可以使用内置的Entity e
实例。将json
添加到您的实体行将自动创建该实例,请参阅:
https://github.com/yesodweb/persistent/wiki/Persistent-entity-syntax#json-instances
答案 1 :(得分:2)
覆盖默认instance
(通常是Yesod的ToJSON e => ToJSON (Entity e)
实例)的常用技巧是使用newtype
。
newtype EntityFeed = EF (Entity Feed)
instance ToJSON EntityFeed where ...
虽然这可能有点不方便。
答案 2 :(得分:0)
正如tel所说,您可以使用newtype
来定义不同类型并绕过限制。但是,如果使用新类型太不方便,您还可以使用语言扩展名OverlappingInstances
。
此扩展允许您拥有重叠的实例,只要总是有一个特定的实例,而另一个实例(如果它匹配将被选中)。
(见http://hackage.haskell.org/trac/haskell-prime/wiki/OverlappingInstances)