Реализация гипотезы Гольдбаха в Хаскеле, множество ограничений
Смысл этого задания состоит в том, чтобы понять списочные представления.
Реализация гипотезы Гольдбаха для некоторого натурального числа (в противном случае поведение не имеет значения) с использованием нескольких предопределенных функций и со следующими ограничениями:
- без вспомогательных функций
- не использовать где или пусть
- только одно определяющее уравнение слева и справа должно быть пониманием списка
- порядок пар в результирующем списке не имеет значения
- использование функций из Prelude разрешено
-- This part is the "library"
dm :: Int -> [ Int ] -> [ Int ]
dm x xs = [ y | y <- xs , y `mod ` x /= 0]
da :: [ Int ] -> [ Int ]
da ( x : xs ) = x : da ( dm x xs )
primes :: [ Int ]
primes = da [2 ..]
-- Here is my code
goldbach :: Int -> [(Int,Int)]
-- This is my attempt 1
goldbach n = [(a, b) | n = a + b, a <- primes, b <- primes, a < n, b < n]
-- This is my attempt 2
goldbach n = [(a, b) | n = a + b, a <- takeWhile (<n) primes, b <- takeWhile (<n) primes]
Ожидаемый результат: список всех пар, суммирующих до указанного целого числа. Но GHC жалуется, что в понимании n не известно. Моя интуиция говорит мне, что мне нужны некоторые функции Prelude для достижения того, что мне нужно, но какая?
Обновить
parse error on input ‘=’
Perhaps you need a 'let' in a 'do' block?
e.g. 'let n = 5' instead of 'n = 5'
1 ответ
Несмотря на странную ошибку, о которой вы говорите, я думаю, что проблема, которую вы на самом деле имеете, заключается в следующем:
Как уже упоминалось @chi и мной, вы не можете использовать a и b в вашем окончательном понимании, прежде чем определите a и b. поэтому вы должны переместить его в и.
Также: равенство целых чисел проверяется с помощью (==)
не (=)
в хаскеле. Таким образом, вы также должны изменить это.
Это будет полный код вашего окончательного подхода:
goldbach n = [(a, b) | a <- takeWhile (<n) primes, b <- takeWhile (<n) primes, n == a + b]
Небольшой тест дает:
*Main> goldbach 5
[(2,3),(3,2)]
Обновить
Если вы хотите достичь того, что написали в своем комментарии, вы можете просто добавить еще одно условие в ваше понимание
n `mod` 2 == 0
или даже лучше: определите свою функцию с помощью охранника следующим образом:
goldbach n
| n `mod` 2 == 0 = [(a, b) | a <- takeWhile (<n) primes, b <- takeWhile (<n) primes, n == a + b]
| otherwise = []
Однако, если я не ошибаюсь, это не имеет ничего общего с реальной гипотезой Годбаха.