2015-06-21 91 views
1

我在Haskell創建一個新的類Eqa哈斯克爾,例如,類型約束

class Eqa a where 

    (=~) :: a -> a -> Bool 

    (/~) :: a -> a -> Bool 

,並要定義(=~)一樣(==)從前奏。所以我試了

instance Eqa Int where    
    x=~y = x==y 

    x/~y = x/=y 

但這隻適用於Int(當然)。 我該如何改變我的代碼,這適用於所有數字類型?

+0

*我該如何改變我的代碼,這可以適用於所有數字類型?*「this」在您的句子中提到的是什麼? – Jubobs

+0

使用我定義的實例,我只能比較Int的類型,但我想比較所有數值類型,即float,Integer,... – Chango

+0

這不是您真正可以做的事情。 Num類型不提供'(==)'。你可以說服GHC用正確的語言編譯指示來接受'instance Num a => Eqa a'的定義,但這是無意義的,實際上你將無法使用它。 –

回答

-1

所有你需要做的是綁定aNum a

instance Num a => Eqa a where    
    x=~y = x==y 
    x/~y = x/=y 

欲瞭解更多信息,看看Numeric Types subsection of Real World Haskell瞭解哪些類是關係到每個數值類型。

+3

這不是一個很好的解決方案。首先,它不能像寫作那樣工作:它需要'FlexibleInstances'和'UndecidableInstances';此外,在現代GHCs中,「Eq」不再是「Num」的超類,所以你也需要一個「Eq a」約束。更重要的是,它使定義'Eqa'的其他實例更加困難:如果我們添加實例Eqa(),其中{_ =〜_ = True; ()=〜()'給我們一個「Overlapping instances」錯誤,因爲'()'*可能*有一個'Num'實例! –

+0

@ AntalS-Z你碰巧知道何時(即哪個版本的GHC)'Eq'不再是'Num'的超類? – Jubobs

+2

@Jubobs:由於GHC 7.4.1。以下是[GHC 7.4.1發行說明](https://downloads.haskell.org/~ghc/7.4.1/docs/html/users_guide/release-7-4-1.html),其中說「The 'Num'類不再具有'Eq'或'Show'超類「;比較[GHC 7.2.1版本說明](https://downloads.haskell.org/~ghc/7.2.1/docs/html/users_guide/release-7-2-1.html),其中沒有提到分類。這是從[本詹姆斯的回答](http://stackoverflow.com/a/19327850/237428)到[完全是這個問題](http://stackoverflow.com/q/19327792/237428)。 –

2

爲什麼不只是寫

(=~) :: Num a => a -> a -> Bool 
x=~y = x==y 

如果你實際上並不需要的代碼是針對不同類型的不同,你爲什麼需要一個類呢?