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)
В этой Haskell программы, включить переключатель mpsGeneric, и результат этой программы:Эквалайзер экземпляр ключа с mpsGeneric включен кажется странным
True
True
False
False
Если отключить mpsGeneric, результат :
True
False
False
True
Похоже, что экземпляр экземпляра выше одного сломан. я проверить программу с
persistent of version 2.2.4.1
persistent-template of version 2.1.6
Это «особенность» убивает меня целый день, когда я запускаю код последующих:
filter (/= someKey) [key1, key2, key3]
Воспроизводится с использованием стойкости-2.2.2.1. Похоже, это происходит http://haddock.stackage.org/lts-5.16/persistent-template-2.1.8/src/Database-Persist-TH.html#mkEntity в 'addSyn'. Если mpsGeneric является False, это будет 'id', и он работает так, как ожидалось. Я думаю, что плохое получение Eq происходит здесь http://haddock.stackage.org/lts-5.16/persistent-2.2.4.1/src/Database-Persist-Class-PersistEntity.html#Key – Cirquit