2013-12-11 22 views
4

我試圖使用持久與Yesod從我的數據庫中的表中獲取所有字段鍵的列表。我的訪問代碼如下:「類型變量不明確」與Haskell中的持久Yesod

getMapList :: Handler [Text] 
getMapList = runDB $ do 
    dbList <- selectList [] [] 
    return (map getMapName dbList) 
    where getMapName (Entity (Key (PersistText mapName)) _) = mapName 

請注意,這是一個遊戲:「地圖」在這裏是遊戲意義上的地圖,而不是在哈斯克爾感。

我得到以下錯誤,它表明類型推理引擎根據我使用的數據庫後端無法計算出我的類型。

Handler/Create.hs:101:13: 
Couldn't match type `PersistEntityBackend t0' 
       with `persistent-1.2.3.0:Database.Persist.Sql.Types.SqlBackend' 
The type variable `t0' is ambiguous 
Possible fix: add a type signature that fixes these type variable(s) 
Expected type: PersistMonadBackend (SqlPersistT (HandlerT App IO)) 
    Actual type: PersistEntityBackend t0 
In a stmt of a 'do' block: dbList <- selectList [] [] 
In the second argument of `($)', namely 
    `do { dbList <- selectList [] []; 
     return (map getMapName dbList) }' 
In the expression: 
    runDB 
    $ do { dbList <- selectList [] []; 
     return (map getMapName dbList) } 

有沒有人知道如何解決這個問題?我需要添加到類型簽名才能正確地進行類型檢查?謝謝!

編輯:我的模型定義爲這樣:

GameMap 
    mapName Text 
    mapCode Text 
    UniqueGameMap mapName 
    deriving Typeable 

回答

3

我認爲你需要添加的過濾器類型的簽名,這是基於你在其他地方定義的表(我不知道如果你想避免需要鍵入列名儘管....我不知道這是可能的)。

這是否適合您?如果表原樣

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| 
KingsLadiesInWaiting 
    name String 
    skillLevel Int 
    deriving Show 
|] 

定義只是添加 -

getMapList :: Handler [T.Text] 
getMapList = runDB $ do 
    dbList <- selectList ([]::[Filter (KingsLadiesInWaitingGeneric backend)]) [] 
    return (map getMapName dbList) 
    where getMapName (Entity (Key (PersistText mapName)) _) = mapName 

當我做這個它編譯。

這應該是一個有趣的遊戲!

+0

我試着用GameMapGeneric代替KingsLadiesInWaitingGenerc,我得到以下錯誤:不在範圍內:類型構造函數或類「GameMapGeneric」。有什麼特別的我需要導入?我正在使用一個腳手架站點,所以我已經把這個分散在一堆文件上,我的處理程序都在他們自己的文件中。 – jmite

+0

當您運行「yesod init」時,它應該創建一個名爲Model.hs的文件,您需要使用該函數在文件中導入該文件。實際模型應該在config/models中,因此您還可以驗證表「GameMap」存在。 – jamshidh

+0

我仍然得到錯誤,當我做「導入模型(GameMapGeneric)」我得到「模塊'模型'不導出'GameMapGeneric'」。有什麼想法嗎?非常感謝迄今爲止所有的幫助。 – jmite