Реализация гипотезы Гольдбаха в Хаскеле, множество ограничений - PullRequest
0 голосов
/ 14 мая 2019

Смысл этого задания - понять понимание списка.

Реализация гипотезы Гольдбаха для некоторого натурального числа (в противном случае поведение не имеет значения) с использованием нескольких предопределенных функций и со следующими ограничениями:

  • без вспомогательных функций
  • не использовать , где или let
  • только одно определяющее уравнение с левой и правой стороны должно бытьпонимание списка
  • порядок пар в результирующем списке не имеет значения
  • допускается использование функций из 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 Ответ

3 голосов
/ 14 мая 2019

Несмотря на странную ошибку, о которой вы говорите, я думаю, что проблема, которую вы на самом деле имеете, заключается в следующем:

Как уже упоминалось @chi и мной, вы не можете использовать a и b в своем окончательном понимании до того, как определите a и b. поэтому вы должны переместить его в и.

Также: равенство целых проверяется с помощью (==), а не (=) в haskell. Так что вам также нужно это изменить.

Это будет полный код вашего окончательного подхода:

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 = []

Однако, если я не ошибаюсь, это не имеет ничего общего с реальной гипотезой Годбаха.

...