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