我在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
(當然)。 我該如何改變我的代碼,這適用於所有數字類型?
我在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
(當然)。 我該如何改變我的代碼,這適用於所有數字類型?
所有你需要做的是綁定a
到Num a
或
instance Num a => Eqa a where
x=~y = x==y
x/~y = x/=y
欲瞭解更多信息,看看Numeric Types subsection of Real World Haskell瞭解哪些類是關係到每個數值類型。
這不是一個很好的解決方案。首先,它不能像寫作那樣工作:它需要'FlexibleInstances'和'UndecidableInstances';此外,在現代GHCs中,「Eq」不再是「Num」的超類,所以你也需要一個「Eq a」約束。更重要的是,它使定義'Eqa'的其他實例更加困難:如果我們添加實例Eqa(),其中{_ =〜_ = True; ()=〜()'給我們一個「Overlapping instances」錯誤,因爲'()'*可能*有一個'Num'實例! –
@ AntalS-Z你碰巧知道何時(即哪個版本的GHC)'Eq'不再是'Num'的超類? – Jubobs
@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)。 –
爲什麼不只是寫
(=~) :: Num a => a -> a -> Bool
x=~y = x==y
如果你實際上並不需要的代碼是針對不同類型的不同,你爲什麼需要一個類呢?
*我該如何改變我的代碼,這可以適用於所有數字類型?*「this」在您的句子中提到的是什麼? – Jubobs
使用我定義的實例,我只能比較Int的類型,但我想比較所有數值類型,即float,Integer,... – Chango
這不是您真正可以做的事情。 Num類型不提供'(==)'。你可以說服GHC用正確的語言編譯指示來接受'instance Num a => Eqa a'的定義,但這是無意義的,實際上你將無法使用它。 –