代码之家  ›  专栏  ›  技术社区  ›  schuelermine

为什么complex的乘法实现需要realfloat?

  •  3
  • schuelermine  · 技术社区  · 7 年前

    在ghci中,可以找到以下内容:

     import Data.Complex
     :t 2 * (3 :+ 4)
    2 * (3 :+ 4) :: RealFloat a => Complex a
     :t (* (3 :+ 4))
    (* (3 :+ 4)) :: RealFloat a -> Complex a -> Complex a
    

    然而:

     :t fmap (* 2) (3 :+ 4)
    fmap (* 2) (3 :+ 4) :: Num a => Complex a -> Complex a
    

    为什么会这样?只是那样吗 fromInteger 在下面 Num a => Complex a 具有类型 RealFloat a => a -> Complex a ?如果是,为什么?

    1 回复  |  直到 7 年前
        1
  •  6
  •   sepp2k    7 年前

    问题是 Complex a 仅实例化 Num 如果 a 实例化 RealFloat . 那就是 号码 实例定义为:

    instance RealFloat a => Num (Complex a) where
        ...
    

    自从 * 由定义 号码 ,您只能使用 * 在一 复合物A 如果它是 号码 ,即,如果 实浮 .

    那么为什么 号码 实例有这个限制吗?

    因为这种方法:

    abs :: a -> a
    

    复数的绝对值可以是非整数,即使它的两个分量都是整数。例如,1+1i的绝对值是2。所以一种方法 abs :: Complex Integer -> Complex Integer 无法定义(至少不能以产生正确结果的方式),因此没有完整的 Num (Complex Integer) 可以定义。所以只有一个 实浮 S.

    对于 signum 方法。

    推荐文章