2016-05-11 5 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) 

В этой 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] 
+1

Воспроизводится с использованием стойкости-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

ответ