Haskell 是否可以快速检查函数类型的函子属性?
我试图实现我自己的functor实例并快速检查它们,但在类型类上遇到了问题,这些类型类不是Haskell 是否可以快速检查函数类型的函子属性?,haskell,typeclass,functor,quickcheck,Haskell,Typeclass,Functor,Quickcheck,我试图实现我自己的functor实例并快速检查它们,但在类型类上遇到了问题,这些类型类不是Eq的实例,即(>)和IO。我的尝试导致没有(Eq…错误的实例 在(>)案例中,我在Show中遇到了类似的错误,即没有(Show…)的实例,并且能够通过添加Show(a->b)实例来解决这个问题,如回答中所建议的。通过类似地添加Eq实例,我似乎也能够解决缺少Eq实例的问题。但是,请注意,在Haskell中,创建Eq(a->b)的实例相当于停止问题,因此是不可能的 我不确定是否可以创建Eq IO a的实例。在
Eq
的实例,即(>)
和IO
。我的尝试导致没有(Eq…
错误的实例
在(>)
案例中,我在Show
中遇到了类似的错误,即没有(Show…
)的实例,并且能够通过添加Show(a->b)
实例来解决这个问题,如回答中所建议的。通过类似地添加Eq
实例,我似乎也能够解决缺少Eq
实例的问题。但是,请注意,在Haskell中,创建Eq(a->b)
的实例相当于停止问题,因此是不可能的
我不确定是否可以创建Eq IO a
的实例。在IO
案例中,我也遇到了无实例(任意…
错误
是否有方法快速检查函数类型的函子属性(>)
?对于IO
类型是否有相同的方法?
我的代码如下
import Prelude hiding (Functor, fmap)
import Test.QuickCheck
import Test.QuickCheck.Function
class Functor f where
fmap :: (a -> b) -> f a -> f b
instance Functor IO where
fmap h f = f >>= (pure . h)
instance Functor ((->) e) where
fmap = (.)
data T a = T
prop_functorid :: (Functor f, Eq (f a)) => T (f a) -> f a -> Bool
prop_functorid T x = fmap id x == x
prop_functorcompose :: (Functor f, Eq (f c)) => T (f a) -> T b -> T c -> f a -> Fun a b -> Fun b c -> Bool
prop_functorcompose T T T x (apply -> g) (apply -> h) =
fmap (h . g) x == (fmap h . fmap g) x
instance Show (a -> b) where
show a= "function"
prop_function :: IO ()
prop_function = do
quickCheck $ prop_functorid (T :: T (String -> String))
quickCheck $ prop_functorcompose (T :: T (String -> String)) (T :: T String) (T :: T String)
prop_io :: IO ()
prop_io = do
quickCheck $ prop_functorid (T :: T (IO String))
quickCheck $ prop_functorcompose (T :: T (IO String)) (T :: T String) (T :: T String)
main = do
prop_function
prop_io
函数
有一个任意实例(共轨道a,任意b)=>任意(a->b)
然后,您可以测试函数的相等性-如果您逐点计算-即生成任意a
并比较IO的f a
值-您需要编写自己的任意实例-除了普通实例arbitral=fmap pure。任意的
我想不出一个合理的。通常,快速检查的函数应该用它的Fun
类型来表示。您可能需要使用Test.QuickCheck.Property
中的(.&&&.
运算符来组合属性,不要创建IO操作并每次单独检查每个属性。绝对没有办法验证IO
的函子实例,因为您的函数(正确地)需要Eq(f a)
,但对于任何类型的a
,您都不能拥有实例Eq(IO a)
。函数是另一回事——有点困难,但是。