Domanda

sto lavorando attraverso Real World Haskell uno dei esercizi del capitolo 4 è quello di implementare una versione basata su foldr concat. Ho pensato che questo sarebbe un ottimo candidato per il test con QuickCheck poiché non v'è un'implementazione esistente per convalidare il mio risultati. Questo mi obbliga tuttavia a definire un'istanza del Arbitrary typeclass che può generare [[Int]] arbitrario. Finora ho stato in grado di capire come fare questo. Il mio primo tentativo è stato:

module FoldExcercises_Test
where

import Test.QuickCheck
import Test.QuickCheck.Batch

import FoldExcercises

prop_concat xs = 
    concat xs == fconcat xs
    where types = xs ::[[Int]]


options = TestOptions { no_of_tests = 200
                      , length_of_tests = 1
                      , debug_tests = True }

allChecks = [ 
              run (prop_concat)
            ]

main = do
  runTests "simple" options allChecks

Ciò si traduce in nessun test in corso di esecuzione. Guardando vari pezzi e pezzi che ho indovinato che era necessaria una dichiarazione di istanza Arbitrary e aggiunto

    instance Arbitrary a => Arbitrary [[a]] where
    arbitrary = sized arb' 
        where arb' n = vector n (arbitrary :: Gen a)

Il risultato è ghci lamentava che la mia dichiarazione di istanza era non validi e che l'aggiunta di -XFlexibleInstances potrebbe risolvere il mio problema. Aggiungendo la direttiva {-# OPTIONS_GHC -XFlexibleInstances #-} risultati in un tipo non corrispondente e una sovrapposizione casi di avvertimento.

Quindi la mia domanda è ciò che è necessario per fare questo lavoro? Sono ovviamente nuovo per Haskell e non sto trovando tutte le risorse che mi aiutano fuori. Tutti gli indicatori sono molto apprezzate.

Modifica

Sembra ero distorta dalla uscita del QuickCheck quando in un test prima fconcat modo è definito come

fconcat = undefined  

In realtà attuare la funzione correttamente anzi dà il risultato atteso. DOOP

È stato utile?

Soluzione

[[Int]] è già un'istanza Arbitrary (perché Int è un'istanza Arbitrary, quindi è [a] per tutti as che sono esse stesse istanze di Arbitrary). In modo che non è il problema.

ho eseguito il codice di me stesso (sostituendo import FoldExcercises con fconcat = concat) ed eseguito 200 test come mi sarei aspettato, quindi sono perplesso sul motivo per cui non lo fa per voi. Ma non c'è bisogno di aggiungere un'istanza Arbitrary.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top