数字和整数类型 类 - Haskell

Num and Integral type classes - Haskell

我正在阅读类型 类、Chapter 2 of Learn You Haskell For Great Good。我的问题是为什么 4 + 3.2 有效但长度 [1, 2, 3, 4] + 3.2 无效,为什么我们需要在第二种情况下使用 fromIntegral 函数。 NumIntegral 类型 类 之间没有关系吗?我如何找到 类 类型是什么?

在这种情况下使用 ghci 来检查类型,例如它会告诉你第一次输入:

Prelude> :t 4 + 3.2
4 + 3.2 :: Fractional a => a

这里的fromInteger是隐含的(4)。

在第二种情况下你遇到了问题,length:: [a] -> Int(在较新的 GHC 中有点不同)并且 3.2 仍然是 :: Fractional a => a 但是 (+):: Num a => a -> a -> a(它需要相同类型的参数 a)- 现在 Int 不是 Fractional 的实例,您会收到错误消息。


如何找到 类 类型是

的实例

PS(原来的答案不见了)——最简单的方法是使用 GHCi 使用 :i 本身:

Prelude> :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’

但请记住,这将取决于加载的模块 - 例如,当您 import Test.QuickCheck 时,您会看到 Int 现在也是 Arbitrary 的实例:

Prelude Test.QuickCheck> :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’
instance [overlap ok] [safe] CoArbitrary Int
  -- Defined in ‘Test.QuickCheck.Arbitrary’
instance [overlap ok] [safe] Arbitrary Int
  -- Defined in ‘Test.QuickCheck.Arbitrary’

length 将其输出类型修复为 Int(与 3.2 不兼容)而不是任何 Num。您要查找的函数是:

genericLength :: Num i => [b] -> i