1) 문제는 sqrt
이 (Floating a) => a -> a
유형이지만 정수를 인수로 사용하려고합니다. 따라서 Integer를 먼저 Floating으로 변환해야합니다.
2 sqrt (fromIntegral x)
)를 작성하여 나는 == 게으른하지 않아야 할 이유를 볼하지만) 무한리스트에 작품으로 빈 콜렉션에 대한 테스트를 위해 당신은 확실히 게으른입니다 null
기능을 (사용할 수 있습니다
isPrime :: Integer->Bool
isPrime x = null [y | y<-[2..floor (sqrt (fromIntegral x))], x `mod` y == 0]
그러나 더 관용적 인 해결책을 얻으려면 문제를 더 작은 하위 문제로 나눕니다. 우선, Y의 *의 Y와 Y의 모든 요소의리스트를 필요 < = X :
filter (\y -> x `mod`y == 0) (takeWhile (\y -> y*y <= x) [2..])
그렇다면 우리는 그리스트 있는지 확인해야
takeWhile (\y -> y*y <= x) [2..]
그렇다면 우리는 X 분할 요소만을 필요
isPrime x = null (filter (\y -> x `mod`y == 0) (takeWhile (\y -> y*y <= x) [2..]))
그리고 이것은 당신에게 Lisp 다운을 보이는 경우, $
isPrime x = null $ filter (\y -> x `mod` y == 0) $ takeWhile (\y -> y*y <= x) [2..]
0 괄호의 일부를 대체 : 비어 추가 설명을 위해
당신은 람다 "아웃소싱"할 수
이
isPrime x = not $ any divisible $ takeWhile notTooBig [2..] where
divisible y = x `mod`y == 0
notTooBig y = y*y <= x
마지막 선언은 2보다 크거나 같은 모든 숫자에서 작동합니다. 1의 경우 1이 소수가 아니므로 소수임을 잘못 나타냅니다. isPrime이 작동하려면 – Elmex80s