2016-05-11 47 views
0
{-# LANGUAGE FlexibleContexts #-} 
{-# LANGUAGE FlexibleInstances #-} 
{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
{-# LANGUAGE GADTs #-} 
{-# LANGUAGE TypeFamilies #-} 
{-# LANGUAGE MultiParamTypeClasses #-} 
{-# LANGUAGE TemplateHaskell #-} 
{-# LANGUAGE QuasiQuotes #-} 
module Main 
    where 

import   Database.Persist.Sql 
import   Database.Persist.TH 

share 
    [mkPersist 
     sqlSettings 
      { mpsGeneric = True 
      , mpsPrefixFields = False 
      , mpsEntityJSON = Just EntityJSON 
           { entityToJSON = 'keyValueEntityToJSON 
           , entityFromJSON = 'keyValueEntityFromJSON 
           } 
      , mpsGenerateLenses = False 
      } 
    , mkMigrate "abc"] 
    [persistLowerCase| 
Test 
    a String 
|] 

main :: IO() 
main = do 
    print $ (toSqlKey 1 :: TestId) /= (toSqlKey 1 :: TestId) 
    print $ (toSqlKey 1 :: TestId) == (toSqlKey 1 :: TestId) 

    print $ (toSqlKey 1 :: TestId) /= (toSqlKey 2 :: TestId) 
    print $ (toSqlKey 1 :: TestId) == (toSqlKey 2 :: TestId) 

在此哈斯克爾程序,我讓mpsGeneric開關,這一方案的結果是:情商實例似乎很奇怪

True 
True 
False 
False 

如果禁用mpsGeneric,結果是:

True 
False 
False 
True 

看來,Eq實例上面的那個壞了。 我測試的程序與

persistent of version 2.2.4.1 
persistent-template of version 2.1.6 

這個「功能」殺了我整整一個下午,當我運行後續代碼:

filter (/= someKey) [key1, key2, key3] 
+1

用persistent-2.2.2.1轉載。看起來像是在'addSyn'中發生http://haddock.stackage.org/lts-5.16/persistent-template-2.1.8/src/Database-Persist-TH.html#mkEntity。如果mpsGeneric是False,這將是'id',並且它按預期工作。我認爲Eq的糟糕派生髮生在這裏http://haddock.stackage.org/lts-5.16/persistent-2.2.4.1/src/Database-Persist-Class-PersistEntity.html#Key – Cirquit

回答