2

私は、私の単純なニーズに対して、Yesod 型が十分に揃っていると思っていました。ハッ!以下は、現在コンパイルされている 2 つの関数ですが、現時点では私が望んでいることを正確に実行しておらず、どのように進めればよいかわかりません。

    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'

タイプを一致させるにはどうすればよいですか?

4

1 に答える 1

1

liftIOHandlerに置き換えるだけliftIOです。liftIOHandler非常にまれな状況でのみ必要なダーティ ハックであり、幸いなことに Yesod 0.10 から完全になくなりました。

于 2012-01-25T13:25:45.010 に答える