当前位置: 首页 > 知识库问答 >
问题:

如何实现这样的数据类型的任意实例?

史懿轩
2023-03-14

我是Haskell的新手,我试图写一个测试用例来证明半群类型类的结合律。

数据类型定义如下:

newtype Combine a b = Combine {unCombine :: (a -> b)}
instance (Semigroup b) => Semigroup (Combine a b) where 
  (Combine f) <> (Combine g) = Combine (\x -> f x <> g x)
assocTestFunc :: (Eq m, Semigroup m) => m -> m -> m -> Bool
assocTestFunc a b c = (a <> b) <> c == a <> (b <> c)
type CombineAssoc = Combine String Ordering -> Combine String Ordering -> Combine String Ordering -> Bool
  quickCheck (assocTestFunc :: CombineAssoc)

共有1个答案

颜云瀚
2023-03-14

可以利用函数的预定义实例。

instance (CoArbitrary a, Arbitrary b) => Arbitrary(Combine a b) where
   arbitrary = Combine <$> arbitrary
 类似资料:
  • 如图所示,渐变背景倾斜平铺

  • 问题 你想定义某些在属性赋值上面有限制的数据结构。 解决方案 在这个问题中,你需要在对某些实例属性赋值时进行检查。 所以你要自定义属性赋值函数,这种情况下最好使用描述器。 下面的代码使用描述器实现了一个系统类型和赋值验证框架: # Base class. Uses a descriptor to set a value class Descriptor: def __init__(self

  • 我不知道如果没有其他变量告诉我哪个更大,我怎么能比较两个可比较的对象。问题是:创建一个名为Max的类,该类提供一个名为Max的类方法。Max将两个参数用于可以比较的对象,即实现如上所示的Java Compariable接口的对象。它返回对较大值的引用。如果两个对象相等,则应返回第一个对象。实现的可比性取决于每个类,您的方法将在多个不同类型的对象上调用。 它在接口中提供了int compareTo(

  • 我想创建一个方法,它可以具有任意数量的参数和任何数据类型的任何方法。 为。我想动态调用以下所有方法void method1(int x,int y)void method2(int x,String y)void method3(Float x,Long y,String z) 我正在使用反射来这样做。现在我讨论了如何在调用这个动态方法的过程中向这些方法传递参数。我做了多远... 如何调用MyMe

  • 我最近读了Tweag的帖子。关于线性类型是表达参数的有用工具,只(准确地)使用一次。他们提出了以下例子: 现在,也许我误解了这个想法,但为什么不能用以下方法来规避呢: 这篇文章特别提到了论点。这是否也扩展到了函数中的所有绑定?