我有這樣的代碼:爲`isprime」類型簽名缺少伴隨結合
esprimo :: Int->Bool
esPrimo x = if length (div x x) == 2 then True else False
但我把誤差超過
我有這樣的代碼:爲`isprime」類型簽名缺少伴隨結合
esprimo :: Int->Bool
esPrimo x = if length (div x x) == 2 then True else False
但我把誤差超過
除了什麼思碧說,我覺得你正在嘗試做的是這樣的:
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
請注意,這當然不是最高效的黃金測試。
'if x then True else False' =='x'。 – user2407038 2014-10-06 15:30:17
@ user2407038如果您閱讀結束的答案,您會在文本中間和最後一個代碼中看到它 – Carsten 2014-10-06 15:41:35
您錯誤的確切原因是因爲在不同的情況下,你在類型簽名和類型定義已經使用:
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
,這會導致您輸入錯誤。
isPrime x = all(/ = 0)$ zipWith mod(repeat x)[2..x-1] – Shanthakumar 2014-10-05 14:51:11
回答後,不要將問題編輯爲新表單。 – Sibi 2014-10-05 14:58:23