Haskell 是否可以快速检查函数类型的函子属性?

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的实例。在

我试图实现我自己的functor实例并快速检查它们,但在类型类上遇到了问题,这些类型类不是
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)
。函数是另一回事——有点困难,但是。