2016-04-18 2 views
2

Я создал функцию для загрузки некоторых Entities но у меня возникают некоторые проблемы, чтобы понять, как я должен поставить его тип декларации, так что я принял это Yesod book chapter о Йесод монад, чтобы лучше понять его, и я пришел в этот фрагмент кода:YesodDB, как поставить типы правильно

-- type Distance = Int 
worksByNhood :: AdrNhoodId -> Int64 -> Int64 -> YesodDB App [(Entity Work, Int, [Entity WImage])] 
worksByNhood nId offset' limit' = do 
    works <- select $ from $ \(w `InnerJoin` d) -> do 
    on $ d ^. AdrDistanceNhood2 ==. w ^. WorkNhood 
    where_ (d ^. AdrDistanceNhood1 ==. val nId) 
    orderBy [asc (d ^. AdrDistanceDistance)] 
    offset offset' 
    limit limit' 
    return (w, d ^. AdrDistanceDistance) 
    works' <- forM works $ \([email protected](Entity wId _), d) -> do 
    images <- select $ from $ \wi -> do 
     where_ (wi ^. WImageWork ==. val wId) 
     return wi 
    return (w, d, images); 
    return works' 

Я думаю, что это Int в типе декларации должен быть преобразован некоторым образом, чтобы быть более конкретным, я получаю эту ошибку:

Select.hs:20:12: 
    Couldn't match type ‘Database.Esqueleto.Value Distance’ with ‘Int’ 
    Expected type: (Entity Work, Distance, [Entity WImage]) 
     Actual type: (Entity Work, 
        Database.Esqueleto.Value Distance, 
        [Entity WImage]) 
    In the first argument of ‘return’, namely ‘(w, d, images)’ 
    In a stmt of a 'do' block: return (w, d, images) 
    In the expression: 
     do { images <- select $ from $ \ wi -> do { ... }; 
      return (w, d, images) } 

ответ

2

я вспомнил, есть chapter about joins in the great Yesod book, так что я прочитал его еще раз и нашел решение, может быть, мой код может помочь другим, так что здесь идет:

module Select where 

import Import hiding((==.), on, Value) 
import Database.Persist.Sql (toSqlKey) -- Useful when I want to explicitly use primary keys 
import Database.Esqueleto 

-- type Distance = Int 
worksByNhood :: AdrNhoodId -> Int64 -> Int64 -> YesodDB App [(Entity Work, Value Distance, [Entity WImage])] 
worksByNhood nId offset' limit' = do 
    works <- select $ from $ \(w `InnerJoin` d) -> do 
    on $ d ^. AdrDistanceNhood2 ==. w ^. WorkNhood 
    where_ (d ^. AdrDistanceNhood1 ==. val nId) 
    orderBy [asc (d ^. AdrDistanceDistance)] 
    offset offset' 
    limit limit' 
    return (w, d ^. AdrDistanceDistance) 
    forM works $ \([email protected](Entity wId _), d) -> do 
    images <- select $ from $ \wi -> do 
     where_ (wi ^. WImageWork ==. val wId) 
     return wi 
    return (w, d, images) 

Value Distance в объявлении типа является ответом