Haskell模糊类型 findMult lst n=[x | x

Haskell模糊类型 findMult lst n=[x | x,haskell,types,primes,ambiguous,Haskell,Types,Primes,Ambiguous,当您在需要浮点值的地方使用整型值时(反之亦然),会收到类似这样的错误消息 在这种情况下,问题是您在num上调用sqrt,它将浮点值作为参数,使编译器认为num是浮点值。但也使用num作为n的上限,这是一个整数值列表(因为它被用作需要整数值列表的findMult的参数) 因此,在调用num上的sqrt之前,先调用from integral,如下所示: <interactive>:1:0: Ambiguous type variable `t' in the constraint

当您在需要浮点值的地方使用整型值时(反之亦然),会收到类似这样的错误消息

在这种情况下,问题是您在
num
上调用
sqrt
,它将浮点值作为参数,使编译器认为
num
是浮点值。但也使用
num
作为
n
的上限,这是一个整数值列表(因为它被用作需要整数值列表的
findMult
的参数)

因此,在调用
num
上的
sqrt
之前,先调用
from integral
,如下所示:

<interactive>:1:0:
    Ambiguous type variable `t' in the constraints:
      `RealFrac t' arising from a use of `primes' at <interactive>:1:0-8
      `Floating t' arising from a use of `primes' at <interactive>:1:0-8
      `Integral t' arising from a use of `primes' at <interactive>:1:0-8
    Probable fix: add a type signature that fixes these type variable(s)

不必求平方根,你可以把所有的平方都取到极限

x = ceiling (sqrt (fromIntegral num))
——而不是
{-x=天花板(sqrt num)
nsqrt=[2..x]}
--避免sqrt
nsqrt=takeWhile(\x->(x-1)^2
我假设
num
应该是一个
整数
?试着告诉编译器类型是什么,这样它就不必猜测了。给出您期望的类型签名,然后看看是否有错误消息。这里的问题是,我认为您的目的过于笼统,而没有明确指定您想要什么。@罗伯特:鉴于浮点和整型不太可能被同一类型实例化,我认为他太矛盾了,不太一般。一般来说,通用不是问题。此外,除了单态限制之外,哈斯克尔代码不会因为遗漏了类型注释而中断。@sepp2k:没有类型annota的正确代码是的,tions将正确编译和工作,但如果没有任何类型批注,则错误代码生成的错误可能会更令人困惑。@John:是的,但Robert说的好像丢失的类型声明可能会导致错误(或者至少我是这样理解的),我只是想澄清事实并非如此。
x = ceiling (sqrt (fromIntegral num))
-- instead of
{- x = ceiling (sqrt num)
   nsqrt = [2..x] -}
-- avoid sqrt
nsqrt = takeWhile (\x -> (x-1)^2 < num) [2..]
-- or even avoid multiplication altogether
nsqrt = map fst . takeWhile ((< num) . snd) . zip [2..] $ scanl1 (+) [1,3..]