我想在haskell中检查文字值-1
是否符合Eq
Typeclass。测试这个的最简单方法是什么。
答案 0 :(得分:3)
文字-1
可以是任何具体类型,例如Int
或Integer
,Float
等。查看类型类型的一种方法是这样的:
λ> let a = -1 :: Int
λ> :i Int
data Int = GHC.Types.I# GHC.Prim.Int# -- Defined in `GHC.Types'
instance Bounded Int -- Defined in `GHC.Enum'
instance Enum Int -- Defined in `GHC.Enum'
instance Eq Int -- Defined in `GHC.Classes'
instance Integral Int -- Defined in `GHC.Real'
instance Num Int -- Defined in `GHC.Num'
instance Ord Int -- Defined in `GHC.Classes'
instance Read Int -- Defined in `GHC.Read'
instance Real Int -- Defined in `GHC.Real'
instance Show Int -- Defined in `GHC.Show'
另一种方法是看哪个类型类可以代表-1
:
λ> :t (-1)
(-1) :: Num a => a
因此,Num
类型类可以代表-1
。
λ> :i Num
instance Num Integer -- Defined in `GHC.Num'
instance Num Int -- Defined in `GHC.Num'
instance Num Float -- Defined in `GHC.Float'
instance Num Double -- Defined in `GHC.Float'
像Int
,Integer
这样的类型就是它的实例。要查看这些类型是否实例化任何其他类型类,只需运行该类型的信息。
答案 1 :(得分:3)
这是一个有点令人困惑的问题,因为"我想检查"暗示您可能想要动态地找到它。
Haskell将在编译时检查所有类型,包括类型类的成员资格。因此,要检查文字是否属于支持Eq的类型,您只需将其与(==)
或(/=)
一起使用并尝试编译它。
如果您只是在探索哪些类型具有Eq实例,请检查GHCi中的:info
命令:
Prelude> let x = 1
Prelude> :info x
x :: Integer -- Defined at <interactive>:1:5
Prelude> :info Integer
data Integer
= integer-gmp:GHC.Integer.Type.S# GHC.Prim.Int#
| integer-gmp:GHC.Integer.Type.J# GHC.Prim.Int# GHC.Prim.ByteArray#
-- Defined in integer-gmp:GHC.Integer.Type
instance Enum Integer -- Defined in GHC.Num
instance Eq Integer -- Defined in GHC.Classes
instance Integral Integer -- Defined in GHC.Real
instance Num Integer -- Defined in GHC.Num
instance Ord Integer -- Defined in GHC.Classes
instance Read Integer -- Defined in GHC.Read
instance Real Integer -- Defined in GHC.Real
Prelude> :info Eq
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
-- Defined in GHC.Classes
instance Eq a => Eq (Maybe a) -- Defined in Data.Maybe
答案 2 :(得分:1)
最简单的方法是让编译器为您检查。如果您假设类型实现Eq
,那么任何推断类型都将自动获得Eq
约束。然后,如果您尝试使用未实现Eq
的类型的值,则您的程序将无法编译。