匹配类型:Befuddlement

时间:2012-01-25 04:30:50

标签: yesod

我认为我的Yesod类型可以满足我的简单需求。哈! 这里有两个现在可以编译的函数,但是目前还没有完全按照我想要的方式完成,而且我不确定如何继续。

    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'

如何让类型匹配?

1 个答案:

答案 0 :(得分:1)

只需将liftIOHandler替换为liftIO即可。 liftIOHandler是一种肮脏的黑客行为,在非常罕见的情况下才是必需的,幸运的是,从Yesod 0.10开始就完全消失了。