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.