此作业的重点是了解列表理解。
使用几个预定义的函数并在以下限制下,对某些自然数(否则行为无关紧要)实施哥德巴赫猜想:
-- 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'
答案 0 :(得分:3)
不管您在谈论什么奇怪的错误,我认为您实际遇到的问题如下:
正如@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 = []
但是,如果我没记错的话,这与实际的哥德巴赫猜想无关。