Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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 函数`(y*y)<;x';应用于两个参数,但其类型为'Bool';没有_Haskell - Fatal编程技术网

Haskell 函数`(y*y)<;x';应用于两个参数,但其类型为'Bool';没有

Haskell 函数`(y*y)<;x';应用于两个参数,但其类型为'Bool';没有,haskell,Haskell,所以我正在努力 我编写了以下函数,希望确定一个数字是否为素数: isPrime :: Integer -> Bool isPrime x = prime x 2 where prime :: Integer -> Integer -> Bool prime x y | ((y*y) < x) and ((x `mod` y) /= 0) = prime x (y+1)

所以我正在努力

我编写了以下函数,希望确定一个数字是否为素数:

isPrime :: Integer -> Bool

isPrime x = prime x 2
            where
            prime :: Integer -> Integer -> Bool
            prime x y | ((y*y) < x) and ((x `mod` y) /= 0) = prime x (y+1)
                      | ((y*y) >= x) = True
                      | otherwise = False
这行应该是这样的:我传递的数字是否小于x的平方根(
((y*y)
),如果是,则检查
x
是否可被
y
((x
mod
y)/=0)
)整除,如果不是,则使用递归和增量y再次检查更高的数字

这一行:

| ((y*y) >= x) = True
如果平方根下面的所有数字都不除以x,那么x必须是素数

最后,这一行:

| otherwise = False
| ((y*y) >= x) = True
意思是沿着直线某处的一个数除以x,所以它不是素数

我认为我写的代码是有意义的,我知道这不是最有效的,考虑到我可以只检查sqrt x下面的素数,而不是sqrt x下面的所有数字,但无论如何,我对这句话有问题:

((y*y) < x)
应该是:

| ((y*y) > x) = True

我想你的意思是使用
&&
而不是
。执行此操作后,加载时不会出现任何错误。

要解释此处发生的情况。。。问题不在于现在运行的
上帝之母。我一直在琢磨为什么它不起作用,我很惊讶它没有给我类似于
不被识别之类的东西。哦,旁注我在我的算法中犯了一个小错误:
|((y*y)>=x)=True
应该是:
|((y*y)>x)=True
@anon:
也是一个函数,但它做了一些其他的事情。@anon:
被识别-只是它不是中缀运算符
是一个函数,它获取一个列表并返回该列表中的所有元素是否均为
。Haskell认为您要做的是用
函数的参数应用函数
(y*y)
(y*y)
不是函数,因此它失败。@anon
被识别;这是一个类型为
[Bool]>Bool
的函数。可以使用类型为
([Bool]->Bool)->Bool->Bool
的函数,这是
(y*y)
表达式位置所需的类型。因此,关于使用Bool类型表达式的消息实际上是编译器在这里给出的最准确的错误;这是唯一的错误。有人知道如何将backticks包含在backticks中吗?我似乎无法逃避它们。
&&
是“逻辑and”的函数,类型为
Bool->Bool->Bool
是一个类似的函数,类型为
[Bool]->Bool
,因此在其周围加上反勾将不会有帮助。@Porges:为您解决了这个问题。据我所知,你需要使用
..
和反斜杠转义的反勾。你可以用两个反勾围绕一个字符串,将其格式化为代码。@Ben:你读了全部内容吗?最后一点就是这么说的。
| ((y*y) >= x) = True
| ((y*y) > x) = True
((y*y) < x) and ((x `mod` y) /= 0)
((y*y) < x) `and` ((x `mod` y) /= 0)
and ((y*y) < x) ((x `mod` y) /= 0)