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