2013-05-08 2 views
3

Yesod 1.2의 새로운 selectRep 함수를 사용하려고하지만 json 응답이 작동하는 데 문제가 있습니다.영구 엔터티 용 ToJSON 인스턴스 생성

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) 

나는 위의 코드에서 얻을 오류 지속적인 실제로 ToJSON (Entity e)here에 대한 인스턴스를 제공합니까 것으로 보인다

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 Feed) 어떻게 든 사용할 수 있습니까?

답변

2

기본값 인 instance (예 : ToJSON e => ToJSON (Entity e) 인스턴스가 무엇인가)을 대체하는 일반적인 트릭은 newtype을 사용하는 것입니다.

newtype EntityFeed = EF (Entity Feed) 
instance ToJSON EntityFeed where ... 

다소 불편할 수도 있지만.

0

tel에서 말한 것처럼 newtype을 사용하여 다른 유형을 정의하고 제한 사항을 우회 할 수 있습니다. 그러나 새로운 유형을 사용하는 것이 너무 불편한 경우 언어 확장 OverlappingInstances을 사용할 수도 있습니다.

이 확장을 사용하면 항상 하나의 특정 인스턴스와 다른 특정 인스턴스 (일치하는 경우 선택 됨)가있는 한 중복 인스턴스를 가질 수 있습니다.

(http://hackage.haskell.org/trac/haskell-prime/wiki/OverlappingInstances 참조)