“isprime”的类型签名缺少附带的绑定

时间:2014-10-05 14:38:24

标签: function haskell

我有这段代码:

esprimo :: Int->Bool
esPrimo x = if length (div x x) == 2 then True else False

但是我把错误拉到了上面

2 个答案:

答案 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区分大小写,因此esprimoesPrimo不同。也就是说,您的代码中存在其他类型错误: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

请注意,这当然不是最高性能的初级测试。