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

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] 
+1

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

Antwort