[英]Is there a way to implement constraints in Haskell's type classes?
是否有某种方式( 任何方式)在类型类中实现约束?
作为我正在谈论的一个例子,假设我想将一个Group实现为一个类型类。 如果有三个函数,那么类型将是一个组:
class Group a where
product :: a -> a -> a
inverse :: a -> a
identity :: a
但这些不是任何功能,但它们必须通过一些限制来联系。 例如:
product a identity = a
product a (inverse a) = identity
inverse identity = identity
等等...
有没有办法在类的定义中强制执行这种约束,以便任何实例都会自动继承它? 举个例子,假设我想实现C2组,定义如下:
data C2 = E | C
instance Group C2 where
identity = E
inverse C = C
这两个定义唯一地确定C2(上述约束定义了所有可能的操作 - 实际上,由于约束,C2是唯一可能具有两个元素的组)。 有没有办法让这项工作?
有没有办法强制执行这种约束?
不是 很多人一直在要求它,包括杰出的Tony Hoare,但是现在还没有出现。
这个问题对于Haskell Prime小组来说是一个很好的讨论话题。 如果有人提出了一个好的建议,可能会在那里找到。
PS这是一个重要的问题!
在某些情况下,您可以使用QuickCheck指定属性。 这不是完全强制执行,但它允许您提供所有实例应该通过的通用测试。 例如,对于Eq,您可能会说:
prop_EqNeq x y = (x == y) == not (x != y)
当然,实例作者仍然需要调用此测试。
为monad法律做这件事会很有趣。
类类可以包含定义和声明。 例:
class Equality a where
(?=), (!=) :: a -> a -> Bool
a ?= b = not (a != b)
a != b = not (a ?= b)
instance Eq a => Equality a where
(?=) = (==)
test = (1 != 2)
您还可以在普通的Haskell中指定特殊约束(让我们称之为法则 ),但不能保证编译器会使用它们。 一个常见的例子是一元法则
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.