2012-01-25 122 views
2

我以爲我有我的簡單需求手中的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

只需將liftIOHandler替換爲liftIO即可。 liftIOHandler是一種骯髒的黑客攻擊,在非常罕見的情況下才是必要的,幸運的是,它完全從Yesod 0.10開始。

+0

昨天晚上這個解決方案出乎我的意料,我希望這是簡單的。 –