确定函数是独立的还是类型类的一部分

时间:2014-05-07 22:14:02

标签: haskell

当我遇到一个函数时,是否有一般的方法来确定它是完全独立的还是类型类的一部分?例如:

fromIntegral :: (Integral a, Num b) => a -> b

这是我为找到答案而开发的方法:

  1. 转到GHCi并对所有列出的类约束:info执行:info Integral:info Num
  2. 检查是否其中任何一个列出了该功能。
  3. 如果是,那就是该类型的一部分。如果没有,那就是一个独立的功能(forIntegral就是这种情况)。
  4. 我的方法听起来好吗?它一般有效吗?

2 个答案:

答案 0 :(得分:12)

您可以直接对该功能:info

Prelude> :info fromInteger
class Num a where
  ...
  fromInteger :: Integer -> a
        -- Defined in `GHC.Num'

Prelude> :info fromIntegral
fromIntegral :: (Integral a, Num b) => a -> b
        -- Defined in `GHC.Real'

如您所见,fromInteger属于Num类型类,而fromIntegral则不属于。{/ p>

答案 1 :(得分:7)

有一种更简单的方法,比较:info fromIntegral:info fromInteger的输出差异:

> :info fromIntegral
fromIntegral :: (Integral a, Num b) => a -> b
        -- Defined in `GHC.Real'
> :info fromInteger
class Num a where
  ...
  fromInteger :: Integer -> a
        -- Defined in `GHC.Num'

了解如何将fromInteger指定为类型类的一部分,但fromIntegral不是?这就是你怎么说的。