2016-03-04 17 views
1

Я пытаюсь изучить Haskell, создав некоторые основные функции. Функция, над которой я сейчас пытаюсь работать, называется primeFactors, и ей нужно вернуть список простых факторов для заданного числа n. В настоящее время у меня есть следующее:Функция Haskell, которая возвращает простые коэффициенты n

factors :: Integral a => a -> [a] 
factors n = [x | x <- [1..n], n `mod` x == 0] 

isPrime :: Integral a => a -> Bool 
isPrime n = factors n == [1, n] 

primeFactors :: Integral a => a -> [a] 
primeFactors n = [] 

Я полагаю, что я должен использовать первые две функции, но я не совсем уверен, как это сделать. Функциональное программирование для меня совершенно новое.

В конце концов, если я называю это так: primeFactors 10 Я ожидаю, что это вернуть [5, 2]

Любая помощь приветствуется. Заранее спасибо.

+0

«Факторы» должны учитывать x <- [1 .. (n + 1) 'div' 2]. Думаю об этом. –

ответ

1

Вы можете использовать функцию «фильтр». Он имеет такой тип:

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

Первый аргумент - это предикат, а второй - список, который вы фильтруете. Результатом является список, содержащий только те элементы, для которых предикат возвращает True. Таким образом, вы можете написать любое из следующего:

primeFactors n = filter isPrime (factors n) 

primeFactors n = filter isPrime $ factors n 

primeFactors = filter isPrime . factors 

Первый должен быть само собой разумеющимся. Второй использует оператор «$», который является просто функциональным приложением с нулевым приоритетом. Его часто используют, чтобы избавиться от скобок в конечном выражении. Последнее находится в стиле «без точек» (термин исходит из топологии: грубо говоря, точка - это переменная). «.» оператор определяется следующим образом:

(f . g) x = f (g x) 

Если заменить «фильтр IsPrime» для «е» и «факторы» за «г» в том, что вы увидите, как это работает.

+0

Я закончил делать следующее, но ваш путь намного чище: '' 'primeFactors n = [x | x <- [1..n], n 'mod' x == 0 && isPrime x]' '' –

+0

не могли бы вы помочь мне с этим? '' nextPrime :: Integral a => a -> a'' '' nextPrime n = n'' Он должен возвращать следующее число после n –

+0

Вы можете сделать это с помощью dropWhile: 'nextPrime n = head. dropWhile (<= n) $ filter isPrime [1 ..] '. После '$' список простых чисел генерируется «на лету» (ленивая оценка: вычисляется только то, что нужно). Затем мы отфильтровываем каждое значение, меньшее или равное 'n', потому что вы хотите следующее простое. Затем мы берем голову, потому что нам нужно только 1. – Renzeee

Смежные вопросы