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
mody)/=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)