我在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'的定义,但这是无意义的,实际上你将无法使用它。 –