2014-10-05 53 views

回答

2

除了什麼思碧說,我覺得你正在嘗試做的是這樣的:

isPrime :: Int -> Bool 
isPrime x = if length [d | d <- [1..x], x `mod` d == 0] == 2 then True else False 

這基本上是beeing 黃金到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 

請注意,這當然不是最高效的黃金測試。

+0

'if x then True else False' =='x'。 – user2407038 2014-10-06 15:30:17

+0

@ user2407038如果您閱讀結束的答案,您會在文本中間和最後一個代碼中看到它 – Carsten 2014-10-06 15:41:35

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,這會導致您輸入錯誤。