Несмотря на странную ошибку, о которой вы говорите, я думаю, что проблема, которую вы на самом деле имеете, заключается в следующем:
Как уже упоминалось @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 = []
Однако, если я не ошибаюсь, это не имеет ничего общего с реальной гипотезой Годбаха.