2015-06-21 102 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 

如果你实际上并不需要的代码是针对不同类型的不同,你为什么需要一个类呢?