Решение. Разобъем решение на несколько шагов.

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.

(можно загрузить готовый файл и отправить его на исполнение командой ghci primesetUTF.lhs)