回答
你不能; ==
有签名a -> a -> Bool
,所以它不能像这样使用。
使用convertible
包,你可以定义
(~==) :: (Convertible a b, Eq b) => a -> b -> Bool
x ~== y = case safeConvert x of
Right x' -> x' == y
Left _ -> False
(==~) :: (Convertible b a, Eq a) => a -> b -> Bool
(==~) = flip (~==)
instance Convertible Int D where ...
-- or D Int depending on what you have in mind
,而不依赖于convertible
,你可以只定义转换功能无论是从Int
到D
(写a == fromInt 2
),反之亦然。
一个不太推荐的路线(对于这个具体情况,我认为它比第一个解决方案简单得多)将是定义你自己的类型类,例如,
class Eq' a b where
(=~=) :: a -> b -> Bool
instance Eq a => Eq' a a where
x =~= y = x == y
instance Eq' D Int where ...
等
我不认为创建自定义类是一个很好的建议。尤其是对新人来说。 –
@NikitaVolkov我已经有了一个“更合理”的选择,但我已经改写了答案,以添加一个更好的(IMO)解决方案,并把它放在最后。 –
我会实现一个投影:
getInt :: D -> Int
getInt (C i _) = i
,然后用它比较:
getInt myD == 5
你甚至可以包括到创纪录的:
data D = C { getInt :: Int, getFloat :: Float }
如果你喜欢
这可以做,但我怀疑你会想这样做。正如阿列克谢提到(==)
的类型是Eq a=>a->a->Bool
,所以做这项工作的唯一方法就是让2
的类型为D
。最初,这可能看似荒谬,但实际上可制成数字有你想要的任何类型,只要该类型是Num
instance Num D where
fromInteger x = C x 1.0
的实例还有很多事情需要解决,但.. ..
首先,你需要充分执行Num
的所有功能,包括(+)
,(*)
,abs
,signum
,fromInteger
和(negate | (-))
。
呃!
其次,你有那额外的Float
来填写fromInteger。我选择了上面的值1.0
,但那是任意的。
三,您还需要实际制作D
一个Eq
的实例,以填写实际的(==)
。
instance Eq D where
(C x _) == (C y _) = x == y
注意,这也是很随意的,因为我需要忽略浮动值,以获得(==)
做你希望它是什么。
底线是,这会做你想要做什么,但在滥用Num
型的成本,以及Eq
型相当严重....的Num
型应保留的东西,你居然会考虑为一个数字,并且Eq
类型应该保留用于比较两个完整的对象,每个部分都包括在内。
- 1. 不同类型的在Haskell
- 2. Haskell派生的Eq for Existentials类型类的实例
- 3. jQuery的EQ()有不同的类名
- 4. Haskell类型同义词
- 5. Haskell的类型不明确
- 6. 了解Haskell的类型
- 7. Haskell中的类型比较
- 8. Haskell“不”类型约束
- 9. Haskell中两个相似的函数如何有不同的多态类型?
- 10. Haskell - 使我的数据成为Eq
- 11. Haskell:从类型
- 12. 如何基于Haskell Groundhog的数据库类型指定不同的列类型?
- 13. 无法推断(Eq a),将Eq添加到类型
- 14. Haskell的类型类与参数类型
- 15. 类型类Haskell中的数据类型
- 16. Haskell的类型类隐含
- 17. Haskell的类型类速记
- 18. haskell分割类型不匹配?
- 19. haskell中的依赖类型队列
- 20. Haskell - 将不同类型的列表混搭?
- 21. 计算N-Ary(带不同类型!!)Haskell中的笛卡尔积
- 22. 如何在haskell中结合两种不同类型的列表
- 23. 试图创建Haskell Eq实例
- 24. Haskell:类型类:多重继承示例
- 25. Haskell的IO功能类型不匹配
- 26. Haskell的类型不匹配INT和[INT]
- 27. 类型系列和派生实例(Eq)
- 28. 如何使一个类型成为Eq
- 29. 理解类型同义词和参数化类型的同义词在Haskell
- 30. Haskell函数类型
请注意,因为我不认为你会收到关于此事的通知:我编辑了我的答案以添加更好的解决方案。 –