Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Haskell想要这个函数';s参数是否具有类型类(RealFrac x,Integral x),而它只需要是Integral x?_Haskell_Show_Integral - Fatal编程技术网

为什么Haskell想要这个函数';s参数是否具有类型类(RealFrac x,Integral x),而它只需要是Integral x?

为什么Haskell想要这个函数';s参数是否具有类型类(RealFrac x,Integral x),而它只需要是Integral x?,haskell,show,integral,Haskell,Show,Integral,我正试图编写一些代码,通过尝试除法对整数进行完全的因式分解。这段代码似乎应该起作用: 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 complete

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

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中,解释器将加载文件并为
completeFacts
提供类型签名
(RealFrac x,Integral x)=>x->[x]
,但是当我试图使用
completeFacts
时,我抱怨说没有办法
显示它,因为它的类型在
show
的上下文中是不明确的。这对我来说很有意义,因为似乎有一种清晰的方法可以将x显示为
RealFrac
积分,但不能同时显示两者

这似乎是令人不快的代码:

...
in tryForFact (fact:fs) (floor ((fromIntegral x) / fact))
我很困惑,因为我会想象将x通过积分
传递,然后将除法结果传递到
楼层
将返回一个
积分
。我不明白为什么Haskell仍然认为x也需要类型类
RealFrac
。为什么Haskell坚持这一点,我如何重写
completeFacts
,使x可以只是一个
积分


谢谢

地板
/
功能绊倒了你

(floor ((fromIntegral x) / fact))
尝试改用
div

fromIntegral x `div` fact

floor
/
功能让您大吃一惊

(floor ((fromIntegral x) / fact))
尝试改用
div

fromIntegral x `div` fact

这是因为在进行除法之前,您没有将
fact
转换为
RealFrac

in tryForFact (fact:fs) (floor (fromIntegral x / fromIntegral fact))
您已经说过,
fact=findAFact x
,它的类型为
Integral x=>x
,但您将其用于与
/
的除法中,因此它认为需要同时满足
Integral
RealFrac

实际上更好的方法是只使用
div
(我也对代码进行了一些清理,这样更易于阅读,并且您不会隐藏
x
的现有绑定):


这是因为在进行除法之前,您没有将
fact
转换为
RealFrac

in tryForFact (fact:fs) (floor (fromIntegral x / fromIntegral fact))
您已经说过,
fact=findAFact x
,它的类型为
Integral x=>x
,但您将其用于与
/
的除法中,因此它认为需要同时满足
Integral
RealFrac

实际上更好的方法是只使用
div
(我也对代码进行了一些清理,这样更易于阅读,并且您不会隐藏
x
的现有绑定):


因为您使用了
/
。您确定吗?我用
div
试了一下,得到了同样的结果。因为你用了
/
。你确定吗?我用
div
试过,得到了同样的结果。谢谢你的回复,但是我试过了,仍然得到了同样的结果。谢谢你的回复,但是我试过了,仍然得到了同样的结果。好的,谢谢;我只需要简化
floor((从积分x)/fact)
x`div`fact
,并去掉周围所有的积垢。@ZackAnderson或其他。我只是告诉你,如果你真的想用那种方式,你可以把它留在里面
div
会简单得多,而且可能会快得多。啊,是的,我明白你最初所说的-
fact
x
有相同的约束条件,我忽略了这一点,这就是为什么使用
fromIntegral
两次或根本不使用它,只使用
div
都有效的原因。谢谢你的帮助@扎克安德森,事实上,如果你知道这些数字是正的(这里似乎是这样),你可以使用
quot
rem
(或
quotRem
),而不是
div
mod
,获得更好的性能。好的,谢谢;我只需要简化
floor((从积分x)/fact)
x`div`fact
,并去掉周围所有的积垢。@ZackAnderson或其他。我只是告诉你,如果你真的想用那种方式,你可以把它留在里面
div
会简单得多,而且可能会快得多。啊,是的,我明白你最初所说的-
fact
x
有相同的约束条件,我忽略了这一点,这就是为什么使用
fromIntegral
两次或根本不使用它,只使用
div
都有效的原因。谢谢你的帮助@ZackAnderson,事实上,如果你知道这些数字是正的(这里似乎是这样),你可以使用
quot
rem
(或
quotRem
)而不是
div
mod
,获得更好的性能。