Подходящие типы: замешательство

Я думал, что у меня есть типы Йесод для моих простых нужд. Ха! Вот две функции, которые компилируются прямо сейчас, но делают не совсем то, что мне хотелось бы в данный момент, и я не уверен, как поступить дальше.

    addNote' selectedProduct = do  
      _ <- runDB $ insert <=< liftIOHandler $ addNote selectedProduct
      return ()


--    addNote :: SelectedProduct -> IO (NotesGeneric SqlPersist)
addNote (MKsp tid firmware version _ requester (Textarea note)) = do
--   currentTime <- getCurrentTime
   return $ Notes tid requester firmware version note undefined

У меня есть сигнатура типа addNote, закомментированная по какой-то причине, если я раскомментирую ее или вызов getCurrentTime, я получу ошибку, которую покажу ниже.

Я не знаю, что такое addNote'. GHC говорит, что это следующее:

    Warning: Top-level binding with no type signature:
               addNote' :: forall master (monad :: * -> *) sub sub1 master1.
                           (YesodPersistBackend master
                              ~
                            Control.Monad.Trans.Reader.ReaderT (HandlerData sub1 master1),
                            YesodPersist master,
                            PersistBackend
                              (Control.Monad.Trans.Reader.ReaderT (HandlerData sub1 master1))
                              (GGHandler sub master IO),
                            Control.Monad.IO.Class.MonadIO monad) =>
                           SelectedProduct
                           -> Control.Monad.Trans.Reader.ReaderT
                                (HandlerData sub master) monad ()

Кроме того, GHC говорит, что тип addNote таков:

           addNote :: forall (m :: * -> *).
                      Monad m =>
                      SelectedProduct -> m (NotesGeneric SqlPersist)

Вот ошибка, которую я получаю, если раскомментирую строку getUTCTime или сигнатуру типа для addNote.

Couldn't match expected type `Control.Monad.Trans.Reader.ReaderT
                                (HandlerData sub0 master0) IO b0'
            with actual type `IO (NotesGeneric SqlPersist)'
Expected type: GGHandler sub0 master0 IO b0
  Actual type: IO (NotesGeneric SqlPersist)
In the return type of a call of `addNote'
In the second argument of `($)', namely `addNote selectedProduct'

Как мне добиться соответствия типов?


person Michael Litchard    schedule 25.01.2012    source источник


Ответы (1)


Просто замените liftIOHandler на liftIO. liftIOHandler — это грязный хак, который необходим только в очень редких случаях и, к счастью, полностью исчез, начиная с Yesod 0.10.

person Michael Snoyman    schedule 25.01.2012
comment
Это решение пришло ко мне неожиданно прошлой ночью, я надеялся, что это так просто. - person Michael Litchard; 25.01.2012