мета-данные страницы
Это старая версия документа!
Решение. Разобъем решение на несколько шагов.
1. Введем свой предикат, показывающий, что a делится нацело на b, т.е. a:b (или тоже самое b|a):
de a b = if ((rem a b) == 0) then True else False
Здесь rem – это функция, возвращающая остаток от деления.
Если он равен нулю, то деление нацело есть.
Будем применять данный предикат так: a `de` b.
2. Определим множество делителей числа n:
divs_of n = [t | t <- [2..(n-1)], n `de` t]
Список порожден значениями t из интервала от 2 до n-1, которые являются делителями числа n.
3. Теперь зададим предикат, указывающий, является ли аргумент простым числом (для этого проверяем список делителей на пустоту):
isprime x = if null (divs_of x) then True else False
4. Все готово. Зададим требуемое множество:
primeset = [n | n <- [2..], isprime n]
Для проверки работоспособности кода его необходимо скопировать в файл с именем, скажем, prime.lhs, затем запустить интерпретатор ghci и в нем загрузить этот файл командой :l prime.lhs.
После чего можно напечатать первые сто простых чисел командой take 100 primeset.
(можно загрузить готовый файл и отправить его на исполнение командой <nowiki>ghci primesetUTF.lhs</wiki>