{-# 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)
In diesem Haskell-Programm, kann ich das mpsGeneric Schalter, und das Ergebnis dieses Programms ist:Die Gleichung Instanz eines Key mit mpsGeneric aktiviert seltsam scheint
True
True
False
False
Wenn disable mpsGeneric, ist das Ergebnis :
True
False
False
True
Es scheint, dass die Eq-Instanz der oben genannten gebrochen ist. Ich teste das Programm mit
persistent of version 2.2.4.1
persistent-template of version 2.1.6
Dieses "Feature" tötet mir einen ganzen Nachmittag, wenn ich die Folge Code ausführen:
filter (/= someKey) [key1, key2, key3]
Reproduziert mit persistent-2.2.2.1. Sieht aus wie es passiert http://haddock.stackage.org/lts-5.16/persistent-template-2.1.8/src/Database-Persist-TH.html#mkEntity in 'addSyn'. Wenn mpsGeneric False ist, wird dies "ID" sein und es funktioniert wie erwartet. Ich denke, die schlechte Herleitung von Eq passiert hier http://haddock.stackage.org/lts-5.16/persistent-2.2.4.1/src/Database-Persist-Class-PersistEntity.html#Key – Cirquit