2016-04-27 9 views
-2

ich beliebig großes Element für meinen benutzerdefinierten Datentyp zu erzeugen versuchen:Quick Check-Generator - beliebiges Element von benutzerdefiniertem Typ

newtype ZippList a = ZPL ([a], [a]) 
    deriving (Show) 

Das ist, was ich habe:

instance Arbitrary a => Arbitrary (ZippList a) where 
arbitrary = sized zipplist where 
    zipplist n = do 
     firstLength <- choose(0,n) 
     secondLength <- n - firstLength 
     firstList <- [arbitrary :: Gen a | [1..firstLength]] 
     secondList <- [arbitrary :: Gen a | [1..secondLength]] 
     return $ ZPL (firstList, secondList) 

aber es nicht kompilieren . Die Kompilierung schlägt fehl für die Generierung der beiden Listen von a. Wie kann ich ein beliebiges a erzeugen?

Verdammt, ich habe irgendwie vergessen, tatsächlich die Werte mit _ <- zu generieren .. Sorry für die triviale Frage, ich codierte späten Stunden.

Antwort

2

Dies funktioniert für mich

instance Arbitrary a => Arbitrary (ZippList a) where 
    arbitrary = sized zipplist where 
    zipplist n = do 
     firstLength <- choose (0, n) 
     let secondLength = n - firstLength 
     firstList <- sequence [arbitrary | _ <- [1..firstLength]] 
     secondList <- sequence [arbitrary | _ <- [1..secondLength]] 
     return $ ZPL (firstList, secondList) 

Beachten Sie, dass die Definition von secondLength keine Monade nicht verwendet, so dass Sie let

+0

'Sequenz verwenden sollten [willkürliche | _ <- [1..firstLength]] sieht für mich wie "replicateM firstLength arbitrary" aus! – epsilonhalbe

+1

@epsilonhalbe Ich bevorzuge auch Ihren Weg, aber die Comprehensions-Ansatz scheint idiomatische in Quickstart aus irgendeinem Grund zu sein, siehe https://www.schoolofhaskell.com/user/griba/quick-check-generator-of-pair-List- index-where-index-in-list-range – jamshidh

+0

Verdammt, ich habe irgendwie vergessen, die Werte mit '_ <-'s zu erzeugen. Sorry für die triviale Frage, ich habe spät geschrieben. Danke für die Antwort trotzdem. – VSZM