【发布时间】:2019-05-14 07:36:07
【问题描述】:
这个作业的重点是理解列表推导。
使用几个预定义的函数并在以下限制下对某个自然数实现哥德巴赫猜想(否则行为无关紧要):
- 无辅助功能
- 不使用 where 或 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'
【问题讨论】:
-
请发布您遇到的错误。你连x都不提,奇怪的是它会说它不知道
-
@FabianSchneider 要求
a + b成为一个列表。let n = a+b那里可能符合意图。 -
@luqui true;我认为这实际上是他的意思:
goldbach n = [(a, b) | a <- takeWhile (<n) primes, b <- takeWhile (<n) primes, n == a + b]确保 n 实际上是元组中的 a + b ... -
在
a <- ...定义之前,您不能使用a。b同上。将n == a+b移到最后。 -
goldbach n = (n, [(a, b) | a <- da [2..n], b <- da [2..n], a+b==n] ).
标签: list haskell list-comprehension primes goldbach-conjecture