Haskell - Нахождение делителей целого числа - PullRequest
0 голосов
/ 02 января 2012

Согласно книге, это так, как это делается, но я не могу заставить это работать. Это дает мне ошибку. Не по объему: 'ld'. Я предполагаю, что должен импортировать какой-то пакет, но не уверен, какой именно. Также в книге используется модуль GS, но я использую WinGHCi с Prelude. Что мне здесь не хватает?

factors :: Int -> [Int]
factors n | n < 1 = error "not positive"
          | n == 1 = []
          | otherwise = p : factors (div n p)
                        where p = ld n

Полагаю, это также можно сделать с помощью функций карт и фильтров? Как?

Ответы [ 3 ]

6 голосов
/ 02 января 2012

Полагаю, цель задания - научить вас понимать списки, filter и подобные конструкции, а не заставлять вас писать функции, проверяющие простоту, или создавать список делителей любым разумным способом.Поэтому вам нужен предикат divides,

divides :: Int -> Int -> Bool
a `divides` b = ???

Затем вы используете этот предикат для аргумента filter или в понимании списка, чтобы найти список делителей, и используйте divisorsфункция для вашего isPrime теста.

5 голосов
/ 02 января 2012

Вы хотите проверить все числа от 1 до n и хранить их только в том случае, если они делят n. Функция filter может помочь вам:

divisors n = filter ??? [1..n]

Так какое условие нужно поставить вместо ????

Для функции isPrime вы можете использовать функцию divisors, как вы уже упоминали.

3 голосов
/ 03 января 2012

Разбейте его на более простые шаги.

Напишите функцию, divides :: Int -> Int -> Bool такую, чтобы

x `divides` n

было истинным, когда x является делителем n.Итак, сначала подумайте, что означает для x делитель n.

Теперь у вас есть способ проверить, является ли одно число x делителем nВам нужно проверить определенный диапазон чисел меньше n, чтобы увидеть, какие из них являются делителями.

Подсказка: в Haskell вы можете сгенерировать список чисел от 1 до n, например, так: [1..n]

Это та функция, которую вы упомянули, filter будет полезной.Проверьте его тип:

filter :: (a -> Bool) -> [a] -> [a]  

Просто замените a выше на Int.

Что касается функции isPrime, просто подумайте, что означает, что число является простым ... если вы правильно рассчитали свои делители, вы можете проверить список, чтобы убедиться, что оно соответствуетс этим свойством.

Если этот является вопросом, связанным с домашним заданием, вы обязательно должны пометить его домашним заданием, тогда люди не будут так стесняться помогать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...