如何在haskell中检查特定文字是否属于类型类

时间:2014-05-14 01:16:38

标签: haskell typeclass

我想在haskell中检查文字值-1是否符合Eq Typeclass。测试这个的最简单方法是什么。

3 个答案:

答案 0 :(得分:3)

文字-1可以是任何具体类型,例如IntIntegerFloat等。查看类型类型的一种方法是这样的:

λ> 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'

IntInteger这样的类型就是它的实例。要查看这些类型是否实例化任何其他类型类,只需运行该类型的信息。

答案 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的类型的值,则您的程序将无法编译。