繁体   English   中英

有没有办法在Haskell的类型类中实现约束?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM