haskell 没有示例(实数浮点数(比率整数))

mrphzbgm  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(124)

我使用的是@DavidYoung提供的here。我有一个函数:

hypergeom ::
     forall a. (Eq a, Fractional a, BaseFrac a)
  => Int            -- truncation weight
  -> BaseFracType a -- alpha parameter (usually 2)
  -> [a]            -- "upper" parameters
  -> [a]            -- "lower" parameters
  -> [a]            -- variables (the eigenvalues)
  -> IO a

但是当我用a = Complex Rational运行它时,我得到这个错误:

No instance for (RealFloat (Ratio Integer))
        arising from a use of `hypergeom'

那是什么意思?
更准确地说,下面是我运行的命令:

ghci> import Data.Ratio
ghci> import Data.Complex
ghci> alpha = 2 % 1 :: Rational
ghci> a = 2 % 10 :+ 1 % 1 :: Complex Rational
ghci> b = 1 % 2 :+ 0 % 1 :: Complex Rational
ghci> c = 2 % 1 :+ 3 % 1 :: Complex Rational
ghci> x1 = 1 % 3 :+ 1 % 4 :: Complex Rational
ghci> x2 = 1 % 5 :+ 1 % 6 :: Complex Rational
ghci> hypergeom 10 alpha [a, b] [c] [x1, x2]

<interactive>:28:1: error:
    * No instance for (RealFloat (Ratio Integer))
        arising from a use of `hypergeom'
    * In the expression: hypergeom 10 alpha [a, b] [c] [x1, x2]
      In an equation for `it':
          it = hypergeom 10 alpha [a, b] [c] [x1, x2]

我很确定这在过去是有效的,但是我使用了Data.Complex.Generic(我不再使用它了,因为它不可能与最近的解析器)。

ccgok5k5

ccgok5k51#

还没有运行代码,但很确定问题是这样的:
使用hypergeom需要一个Fractional a示例。Complex的相关示例为:

instance RealFloat a => Fractional (Complex a)

所以,我们需要一个RealFloat Rational示例。但是Rational = Ratio Integer。所以我们需要一个RealFloat (Ratio Integer)示例。在作用域中没有这样的示例。因此,出错。

nfeuvbwi

nfeuvbwi2#

我发现了一个窍门。人们可以使用 * 分圆 * 数。它们包含有有理真实的和虚部的复数。

instance BaseFrac Cyclotomic where
  type BaseFracType Cyclotomic = Rational
  inject x = gaussianRat x 0

例如:

ghci> import Data.Complex.Cyclotomic
ghci> import Data.Ratio
ghci> alpha = 2%1
ghci> a = gaussianRat (2%7) (1%2)
ghci> b = gaussianRat (1%2) (0%1)
ghci> c = gaussianRat (2%1) (3%1)
ghci> x1 = gaussianRat (1%3) (1%4)
ghci> x2 = gaussianRat (1%5) (1%6)
ghci> hypergeom 10 alpha [a, b] [c] [x1, x2]
2636302089639370293242525873640165272590821169/2525202250482591646557047218608537600000000000 + 107068626184021125113299563281620084111568417/2525202250482591646557047218608537600000000000*e(4)

相关问题