簡體   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