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]
用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