在Haskell';什么类型的课程?

在Haskell';什么类型的课程?,haskell,functional-programming,class,constraints,typeclass,Haskell,Functional Programming,Class,Constraints,Typeclass,是否有某种方法(任何方法)在类型类中实现约束 作为我所说的示例,假设我想将一个组实现为一个类型类。如果有三个函数,那么一个类型就是一个组: class Group a where product :: a -> a -> a inverse :: a -> a identity :: a 但这些不是任何函数,但它们必须通过一些约束条件相关联。例如: product a identity = a product a (inverse a) = i

是否有某种方法(任何方法)在类型类中实现约束

作为我所说的示例,假设我想将一个组实现为一个类型类。如果有三个函数,那么一个类型就是一个组:

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是唯一具有两个元素的可能组)。有什么方法可以实现这一点吗?

类型类可以包含定义和声明。例如:

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)
您还可以在plain Haskell中指定特殊约束(我们称之为laws),但不能保证编译器会使用它们。一个常见的例子是

有没有办法强制执行这种约束

没有。很多人都在要求它,包括著名的托尼·霍尔,但还没有任何东西出现在地平线上

这个问题对小组来说是一个很好的讨论话题。如果有人提出了一个好的建议,很可能会在那里找到


这是一个重要的问题

在某些情况下,可以使用快速检查指定属性。这并不完全是强制执行,但它允许您提供所有实例都应通过的通用测试。例如,对于Eq,您可能会说:

prop_EqNeq x y = (x == y) == not (x != y)
当然,调用此测试仍然取决于实例作者


为monad定律这样做会很有趣。

(呃,
逆C=C
,当然?)是的,感谢您注意到这些约束通常被称为定律示例monad定律。我坚信编译时检查这些约束的满足性是等价的。你能解释一下这件事吗?@fishlips:如果一个编译器能够自己检查一个实现是否满足这样的约束条件,我会感到震惊,但我不能说我对重写文献这个术语了解得足够透彻,以至于有信心写一个证明。然而,我怀疑在任何可能的部署中,如果程序员希望在编译时检查约束,他或她将被要求提供机器可检查的证明!嗯。。。听到这个消息很难过。有没有其他语言可以执行这种约束检查?我想解决的一个问题是,在给定一些代数约束的情况下(例如,找到所有可能的n阶群),制作一个程序来查找所有可能的实例。我听说prolog可以做类似的事情,但我更喜欢函数式语言。@Rafael S.Calsaverini:支持依赖类型的语言可以验证这些属性,但您必须提供约束满足的构造性证明。Agda2语言与Haskell非常相似,并且有许多很好的教程,因此您可以很快开始学习。你也可以看看警句。