**Решение.** Разобъем решение на несколько шагов.
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.
Для интереса попробуйте задать divs_of 360, или проверить isprime (10^100000+1).
(можно загрузить [[http://wiki.nsunc.com/_media/haskell/haskell/primesetutf.lhs|готовый файл]] и отправить его на исполнение командой ghci primesetUTF.lhs)
**Задачи для самостоятельного размышления.** Написать оптимизированный код.
Например, использовать элементы решета Эратосфена для просмотра делителей.
Сделать код компактней. Или написать функцию, ищущию простое число больше
данного натурального.