为什么Haskell只需要为整数x时,为什么希望此函数的参数具有类型类(RealFrac x,整数x)?

佐伊·斯帕克斯(ZoëSparks)

我正在尝试编写一些代码,通过试验除法对整数进行完全分解。这段代码似乎应该起作用:

findAFact :: Integral x => x -> x
findAFact x = searchInts [2, 3..] x where
    searchInts (int:ints) div
        | div `mod` int == 0 = int
        | otherwise          = searchInts ints div

completeFacts :: Integral x => x -> [x]
completeFacts x = tryForFact [] x where
    tryForFact fs x = if x == 1
                      then fs
                      else let fact = findAFact x
                           in tryForFact (fact:fs) (floor ((fromIntegral x) / fact))

但是,如果我尝试对此进行编译,则会出现以下错误:

Could not deduce (RealFrac x) arising from a use of 'tryForFact'
from the context (Integral x)
  bound by the type signature for
             completeFacts :: Integral x => x -> [x]
  at 5.hs:26:18-39
Possible fix:
  add (RealFrac x) to the context of
    the type signature for completeFacts :: Integral x => x -> [x]
In the expression: tryForFact [] x
In an equation for 'completeFacts':
    completeFacts x
      = tryForFact [] x
      where
          tryForFact fs x
            = if x == 1 then
                  fs
              else
                  let ... in tryForFact (fact : fs) (floor ((fromIntegral x) / fact))

如果我从中删除类型签名completeFacts并尝试将其加载到GHCI中,则解释器将加载文件并(RealFrac x, Integral x ) => x -> [x]为其提供类型签名completeFacts,但是当我尝试使用completeFacts该方法时会抱怨show,因为在的上下文中其类型不明确,因此无法使用show这对我来说很有意义,因为似乎有一种清晰的方法将x显示为aRealFrac an Integral,但不能同时显示两者。

这似乎是令人反感的代码:

...
in tryForFact (fact:fs) (floor ((fromIntegral x) / fact))

我很困惑,因为我想象过将xfromIntegral传递给然后将除法的结果传递floor给我会得到Integral回报。我不明白为什么Haskell仍然认为x还需要具有类型类RealFracHaskell为什么坚持这一点,以及如何重写才能completeFacts使x只能是an Integral

谢谢!

比克利尔

这是因为您在进行除法运算之前没有转换factRealFrac

in tryForFact (fact:fs) (floor (fromIntegral x / fromIntegral fact))

您已经说过了fact = findAFact x,它具有类型Integral x => x,但是您正在将其与一起使用/,因此它认为它需要同时满足IntegralRealFrac

实际上更好的方法是使用它div(我也对代码进行了一些整理,以使它更易于阅读,并且您不会在现有的绑定上留下阴影x):

completeFacts :: Integral x => x -> [x]
completeFacts x = tryForFact [] x
    where
        tryForFact fs 1 = fs
        tryForFact fs y = let fact = findAFact y
                          in tryForFact (fact:fs) (y `div` fact)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么对于整数,2 * x * x比Python 3.x中的2 *(x * x)快?

整数ceil(sqrt(x))

为什么x86-64的jmpq只需要32位长度的地址?

为什么从Android的性能提示中删除“避免只需要整数的枚举”?

为什么对于整数类型,“ sum + = x”与“ sum + = * x”的工作方式相同?这是自动引用吗?

为什么有些开发人员以这种方式分配原始整数?整数i = 0x0001

为什么带有GCC的x86上的整数溢出会导致无限循环?

为什么已经有“ println(Object x)”时为什么需要“ println(char [] x)”-Java

如何找到小于x的最大整数?

matplotlib在X轴上绘制整数

获取范围为(x,y]的随机整数?

如果整数大于x但小于y(快速)

整数常数后缀'x50'无效

从小于 X 的 id 生成整数哈希?

最快的整数搜索任意X和Y

在 x86 程序集中打印整数

当 x 是有符号整数且 x=1 时,找到这样的值 y (x < y) == (-x > -y) 将是假的?

为什么在x86上对自然对齐的可变原子进行整数赋值?

为什么x86 assember允许将负整数放入无符号变量中?

为什么X11窗口标识符这么大(无符号长整数)?

为什么 x 必须是使用 binom.test 的非负整数

为什么+ = x比a = a + x慢?

为什么某些Haskell函数不抽象具体整数类型?

当n和x是整数且n> = x时,n + x = n将对x的多少个值进行XOR?

查找一个非零整数x,其中x == -x?

如何将x打印为0x,其中x是整数C ++

为什么 Number("x") == BigInt("x") ... 只是有时?

如果x,y和a是具有整数值的数字,x / y是否舍入为与(x * a)/(y * a)相同的值?

为什么 (X.shape[0], -1) 在矩阵 X 上使用 reshape 函数时用作参数?