Я написал свою первую программу в Haskell сегодня. It compiles and runs successfully. И так как это не является типичным «Hello World» программы, она на самом деле делает гораздо больше, чем это, поэтому, пожалуйста, поздравляет меня: DРазница между `(Integer a) => a -> Bool` и` Integer -> Bool`?
Во всяком случае, у меня есть некоторые сомнения по поводу моего кода, и синтаксис в Haskell ,
Проблема:
Моя программа считывает целое число N
из стандартного ввода, а затем, для каждого целого i
в диапазоне [1,N]
, он печатает i
, является ли простое число или нет. В настоящее время он не проверяет входную ошибку. :-)
Решение: (также сомнения/вопросы)
Чтобы решить эту проблему, я написал эту функцию для проверки простоты целого:
is_prime :: Integer -> Bool
is_prime n = helper n 2
where
helper :: Integer -> Integer -> Bool
helper n i
| n < 2 * i = True
| mod n i > 0 = helper n (i+1)
| otherwise = False
Он прекрасно работает. Но я сомневаюсь, что первая строка является результатом многих хитов и испытаний, поскольку то, что я читал в this tutorial, не работает, и дал эту ошибку (I предположим, что это ошибка, хотя она не говорит так):
prime.hs:9:13:
Type constructor `Integer' used as a class
In the type signature for `is_prime':
is_prime :: Integer a => a -> Bool
Согласно the tutorial (который является хорошо написанный учебник, кстати), первая строка должна быть: (учебник говорит (Integral a) => a -> String
, поэтому я думал, (Integer a) => a -> Bool
должен работать, а.)
is_prime :: (Integer a) => a -> Bool
которые делают не работает, и выдает указанную выше ошибку (?).
И почему это не работает? В чем разница между этой линией (которая не работает) и линией (которая работает)?
Кроме того, что идиоматический способ перебрать 1
к N
? Я не вполне доволен циклом в моем коде. Пожалуйста, предложите улучшения. Вот мой код:
--read_int function
read_int :: IO Integer
read_int = do
line <- getLine
readIO line
--is_prime function
is_prime :: Integer -> Bool
is_prime n = helper n 2
where
helper :: Integer -> Integer -> Bool
helper n i
| n < 2 * i = True
| mod n i > 0 = helper n (i+1)
| otherwise = False
main = do
n <- read_int
dump 1 n
where
dump i x = do
putStrLn (show (i) ++ " is a prime? " ++ show (is_prime i))
if i >= x
then putStrLn ("")
else do
dump (i+1) x
Вы имеете в виду 'Integral a'? – Heatsink
@Heatsink: Нет. Я даже не знаю, существует ли «Интеграл». Имеет ли это? Предполагается ли это «Интеграл»? – Nawaz
Вероятно, он должен быть «Интегральным». Кроме того, ваши две гиперссылки идут на один и тот же URL-адрес, является ли это намеренным? – Heatsink