gpt4 book ai didi

haskell - Num 和 Integral 类型类 - Haskell

转载 作者:行者123 更新时间:2023-12-02 15:47:00 25 4
gpt4 key购买 nike

我正在阅读类型类(class),Chapter 2 of Learn You Haskell For Great Good 。我的问题是为什么 4 + 3.2 有效,但 length [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’

关于haskell - Num 和 Integral 类型类 - Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32439935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com