我有这段代码:
esprimo :: Int->Bool
esPrimo x = if length (div x x) == 2 then True else False
但是我把错误拉到了上面
答案 0 :(得分:2)
错误的确切原因是因为您在类型签名和类型定义中使用了不同的案例:
esprimo :: Int -> Bool -- p should be capital here to work.
esPrimo x = if length (div x x) == 2 then True else False
Haskell区分大小写,因此esprimo
和esPrimo
不同。也就是说,您的代码中存在其他类型错误:div
的类型为div :: Integral a => a -> a -> a
,因此返回a
并且您正在应用length
函数。但length
函数只接受列表,即[a]
而不是a
,这会产生类型错误。
答案 1 :(得分:2)
除了sibi所说的,我认为你要做的是:
isPrime :: Int -> Bool
isPrime x = if length [d | d <- [1..x], x `mod` d == 0] == 2 then True else False
这基本上是将 prime 的数学概念直接翻译成Haskell。
由于您不需要if
,因为它检查相同的==
已经返回,可能更具可读性:
isPrime :: Int -> Bool
isPrime x = length divisors == 2
where divisors = [d | d <- [1..x], x `isMultipleOf` d]
isMultipleOf m n = m `mod` n == 0
请注意,这当然不是最高性能的初级测试。