Vì vậy, tôi đang làm việc trên Problem 31.Hàm `(y * y) <x 'được áp dụng cho hai đối số, nhưng kiểu` Bool' của nó không có
Tôi đã viết hàm sau với hy vọng để xác định xem một số là số nguyên tố:
isPrime :: Integer -> Bool
isPrime x = prime x 2
where
prime :: Integer -> Integer -> Bool
prime x y | ((y*y) < x) and ((x `mod` y) /= 0) = prime x (y+1)
| ((y*y) >= x) = True
| otherwise = False
Logic của tôi là thực hiện một chức năng isPrime
, và có một chức năng trong isPrime
gọi prime
để lưu trữ 2 thông số, các số Tôi muốn kiểm tra xem nó có phải là số nguyên tố (x
) và một trình vòng lặp để kiểm tra tất cả các số dưới sqrt của x và xem liệu chúng có phân chia x
hay không. prime
có 3 lính gác:
| ((y*y) < x) and ((x `mod` y) == 0) = prime x (y+1)
Dòng này là nghĩa vụ phải nói: là số tôi trôi qua dưới căn bậc hai của x (((y*y) < x)
) và nếu nó là kiểm tra xem x
là chia hết cho y
(((x
mod y) /= 0)
) , nếu nó không phải là tôi sử dụng đệ quy và tăng y để kiểm tra lại với một số cao hơn.
dòng này:
| ((y*y) >= x) = True
là nghĩa vụ phải được như thế nào nếu tất cả các số bên dưới căn bậc hai không chia x trong anyway, x phải nguyên tố.
Cuối cùng, dòng này:
| otherwise = False
có nghĩa là một số ở đâu đó dọc theo dòng một số chia x vì vậy nó không là số nguyên tố.
Tôi nghĩ rằng mã tôi viết có ý nghĩa, tôi biết nó không hiệu quả nhất, xem xét tôi chỉ có thể kiểm tra số nguyên tố dưới sqrt x và không phải tất cả các số dưới sqrt x, nhưng dù sao, tôi gặp vấn đề với điều này tuyên bố:
((y*y) < x)
GHCi nói:
The function `(y * y) < x' is applied to two arguments, but its type `Bool' has none
tôi nghĩ rằng <
được cho là mất trong hai đối số và trả về một Bool, thông báo lỗi không thực sự có ý nghĩa đối với tôi. Bạn có thể giúp tôi tìm ra những gì tôi đang làm sai? Cảm ơn.
chỉnh sửa nhanh bây giờ mà tôi đã nhận nó để chạy, dòng này:
| ((y*y) >= x) = True
nên là:
| ((y*y) > x) = True
Urgh. Bất cứ ai biết làm thế nào để bao gồm backticks bên trong backticks trên SO? Tôi dường như không thể thoát khỏi chúng. – porges
'&&' là hàm cho "hợp lý và", với kiểu 'Bool -> Bool -> Bool'. 'và' là một hàm tương tự với kiểu' [Bool] -> Bool', do đó, đặt các dấu backticks xung quanh nó sẽ không giúp ích gì ở đây. – Ben
@Porges: Đã sửa lỗi cho bạn. Cho đến khi tôi biết, bạn cần sử dụng '
...
'với các dấu gạch chéo ngược thoát ở bên trong. –