vardır. Bu yüzden Problem 31 üzerinde çalışıyorum. Bir sayının asal olup olmadığını belirlemek için umuduyla aşağıdaki işlevi yazdım`(y * y) <x 'işlevi iki bağımsız değişkene uygulanır, ancak' Bool 'türünde hiçbiri
:
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
Benim mantık bir isPrime
işlevi yapmak ve 2 parametreleri, saklamak için prime
denilen isPrime
içinde bir işlevi vardır oldu numara asal olup olmadığını kontrol etmek istiyorum (x
) ve x'in altındaki tüm sayıları kontrol etmek için bir yineleyici ve x
'u bölüp bölmediklerini görün. Bu çizgi söylemek gerekiyordu
| ((y*y) < x) and ((x `mod` y) == 0) = prime x (y+1)
: prime
3 korumaları var ben x (((y*y) < x)
) karekökü daha az sayıda geçirilir ve kontrol ise x
bölünebilir ise y
(((x
mod y) /= 0)
) Eğer değilse, yinelemeyi ve daha yüksek bir sayı ile tekrar kontrol etmek için y'yi kullanırım.
Bu hat:
| ((y*y) >= x) = True
kare kökünün altındaki tüm sayılar zaten x bölmek yoksa gibi olmak mı gerekiyor x asal olmalıdır.
Son olarak, bu satır:
| otherwise = False
o asal değildir bu yüzden bir numara bir yerlerde bir x sayısı bölünmüş demektir.
Yazdığım kodun mantıklı olduğunu düşündüm, en verimli olduğunu biliyorum, sqrt x'in altındaki tüm sayıları kontrol edemediğimi düşündüğümden, ancak her neyse, sqrt x'in altındaki sayıları kontrol edemem, deyim:
((y*y) < x)
GHCi diyor ki:
The function `(y * y) < x' is applied to two arguments, but its type `Bool' has none
Ben <
iki bağımsız değişken almak ve bir Bool, hata mesajı gerçekten benim için bir anlam ifade etmiyor dönmek gerekiyordu düşündüm. Neyi yanlış yaptığımı öğrenmeme yardım edebilir misin? Teşekkürler.
Ben çalıştırmak lazım şimdi Hızlı düzenleme, bu hat:
| ((y*y) >= x) = True
olmalıdır:
| ((y*y) > x) = True
Urgh. Backtick'lerin backtick'lere nasıl ekleneceğini bilen var mı? Onları kaçışa benzemiyorum. – porges
'&&', “mantıksal” ve “Bool -> Bool -> Bool” türünde bir işlevdir. '' '' [Bool] -> Bool' türünde benzer bir işlevdir, bu yüzden etrafındaki backtickleri buraya koymaya yardımcı olmaz. – Ben
@Porges: Sizin için düzeltildi. Bildiğim kadarıyla, içeride ters eğik çizgiden kaçan backtraflarla '
...
' kullanmanız gerekiyor. –