2011-03-06 12 views
11

Estoy tratando de escribir una propiedad QuickCheck que toma una o más funciones como entrada. Para simplificar las cosas, considere una propiedad para comprobar que la composición de funciones es equivalente a la aplicación de la función sucesiva, y un piloto de pruebas rápido y sucio-:Funciones de presentación utilizadas en las propiedades QuickCheck

import Test.QuickCheck 

prop_composition :: (Int -> Int) -> (Int -> Int) -> Int -> Bool 
prop_composition f g x = (f . g) x == f (g x) 

main :: IO() 
main = quickCheck prop_composition 

Desafortunadamente, esto no se compila, porque las entradas a una la propiedad tiene que poner en práctica de manera que Show QuickCheck puede informar qué insumos causaron el fracaso, pero no hay Show aplicación para funciones:

Test.hs:10:7: 
    No instance for (Show (Int -> Int)) 
     arising from a use of `quickCheck' at Test.hs:10:7-33 
    Possible fix: add an instance declaration for (Show (Int -> Int)) 
    In the expression: quickCheck prop_composition 
    In the definition of `main': main = quickCheck prop_composition 

he intentado escribir mi propia instancia de no hacer nada de Show para funciones ...

instance Show (a -> b) where 
    show _ = "[func]" 

... que compila, pero desencadena una advertencia con -Wall ...

Test.hs:3:9: Warning: orphan instance: instance Show (a -> b) 

... que me hace pensar que hay una manera más correcta de hacer esto.

Mi instinto me dice que la respuesta está en el módulo Test.QuickCheck.Function, pero no está documentado, y no puedo averiguar simplemente por las firmas de tipo para qué sirve el contenido o cómo se va a utilizar.

Respuesta

10

Tienes razón Test.QuickCheck.Function es la respuesta correcta. Usted acaba de cambiar los tipos:

prop_composition  :: Fun Int Int -> Fun Int Int -> Int -> Bool 
prop_composition f g x = ((apply f) . (apply g)) x == (apply f) ((apply g) x) 
3

El import Text.Show.Functions también podrían utilizarse con el mantenimiento de la firma original.

Cuestiones relacionadas