2011-03-06 30 views
11

Giriş olarak bir veya daha fazla işlev alan bir QuickCheck özelliği yazmaya çalışıyorum. Bu fonksiyon kompozisyonu kontrol etmek için bir özellik düşünün basit tutabilmek için ardışık işlevi uygulamasına eşdeğerdir ve kirli hızlı ve test sürücüsü:HızlıKontrol özelliklerinde kullanılan gösterme işlevleri

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 

Maalesef bu derleme değil bir girdiler çünkü mülkiyet QuickCheck girişler başarısızlık neyin neden rapor böylece Show uygulamak gerekir, ancak işlevleri için hiçbir Show uygulaması var: Ben fonksiyonlar için Show benim kendi do-nothing örneğini yazmaya denedim

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 

...

derler ama -Wall ile bir uyarı tetikler
instance Show (a -> b) where 
    show _ = "[func]" 

... ...

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

... bana bunu yapmak daha doğru yol olduğunu düşünüyorum yapar.

Bağırsak bana cevabın Test.QuickCheck.Function modülünde yandığını, ancak belgenin belgesiz olduğunu ve tür imzalarına bakmanın ne anlama geldiğini veya nasıl kullanılmasının amaçlandığını anlayamıyorum.

cevap

10

Haklısınız Test.QuickCheck.Function doğru cevap. Sadece türlerini değiştirmek:

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

import Text.Show.Functions da orijinal imzasını tutulması ile kullanılabilir.

İlgili konular