这不是作业,我只是好奇.
INFINITE是这里的关键词.
我希望在primes()中使用它作为p.我相信这是Haskell中的内置函数.
所以,答案不能像"Just do a Sieve"那样天真.
首先,您不知道将消耗多少连续素数.好吧,假设你可以一次编制100个.您是否会使用相同的Sieve方法以及素数公式的频率?
我更喜欢非并发方法.
感谢您阅读(和写作;))!
我无法理解这段代码:
let
  sieve (p:xs) = p : sieve (filter (\ x -> x `mod` p /= 0) xs)
in sieve [2 .. ]
Run Code Online (Sandbox Code Playgroud)
有人可以为我分手吗?我知道它有递归,但这就是问题我无法理解这个例子中的递归是如何工作的.
看一下GHC源代码,我可以看到修复的定义是:
fix :: (a -> a) -> a
fix f = let x = f x in x
Run Code Online (Sandbox Code Playgroud)
在一个示例中,修复程序使用如下:
fix (\f x -> let x' = x+1 in x:f x')
Run Code Online (Sandbox Code Playgroud)
这基本上产生了一个数字序列,它们增加1到无穷大.为了实现这一点,修复必须将它接收的函数作为它的第一个参数直接回到该函数.我不清楚上面列出的修复定义是如何做到的.
这个定义是我如何理解修复的工作原理:
fix :: (a -> a) -> a
fix f = f (fix f)
Run Code Online (Sandbox Code Playgroud)
所以现在我有两个问题:
我是Haskell的新手,我正试图以流处理方式实现Euler的Sieve.
当我查看关于素数的Haskell Wiki页面时,我发现了一些神秘的流优化技术.在3.8维基的线性合并中:
primesLME = 2 : ([3,5..] `minus` joinL [[p*p, p*p+2*p..] | p <- primes']) 
  where
    primes' = 3 : ([5,7..] `minus` joinL [[p*p, p*p+2*p..] | p <- primes'])
joinL ((x:xs):t) = x : union xs (joinL t)
Run Code Online (Sandbox Code Playgroud)
它说
" 根据Melissa O'Neill的代码,这里引入了双素数反馈,以防止不必要的记忆,从而防止内存泄漏."
怎么会这样?我无法弄清楚它是如何工作的.
primes haskell sieve-of-eratosthenes lazy-sequences space-leak
我试图理解这段代码,该代码返回[a]传递给它的所有可能的组合:
-- Infinite list of all combinations for a given value domain
allCombinations :: [a] -> [[a]]
allCombinations []     = [[]]
allCombinations values = [] : concatMap (\w -> map (:w) values)
                                        (allCombinations values)
Run Code Online (Sandbox Code Playgroud)
在这里,我尝试了此示例输入:
ghci> take 7 (allCombinations [True,False])
[[],[True],[False],[True,True],[False,True],[True,False],[False,False]]
Run Code Online (Sandbox Code Playgroud)
在我看来,递归最终将如何停止并返回是无法理解的[ [ ] ],因为allCombinations函数当然没有任何指针在列表中移动,每次调用以及在遇到基本情况时[ ]都会返回[ [ ] ]。据我说,它将调用allCombinations函数无限,并且永远不会停止。还是我想念什么?
另一方面,在执行完所有计算之后,在递归调用完成之后返回,仅在执行所有计算后,take仅返回第一个7元素final list。那么实际上递归如何满足这里的基本情况?
其次concatMap,这里的目的是什么,在这里我们还可以使用Mapfunction来将函数应用于列表,而在内部函数中我们可以排列列表?实际concatMap在这里做什么。从定义来看,它concatMap告诉我们它首先映射了函数,然后将列表连接起来,正如我所看到的,我们已经在函数内部进行了此操作?
任何宝贵的意见将不胜感激?
我正试图理解"按需召唤"背后的定理.我理解这个定义,但我有点困惑.我想看一个简单的例子,它显示了按需调用的方式.
在阅读了一些以前的线程之后,我发现Haskell使用了这种评估.是否有其他编程语言支持此功能?
我读到了Scala的名字调用,我确实知道按名称调用和按需调用是相似的,但由于需要调用将保持评估值这一事实不同.但我真的很想看到一个真实的例子(它没有必须在Haskell),这表明调用 - 需要.
haskell ×5
primes ×3
recursion ×2
call-by-need ×1
generator ×1
list ×1
python ×1
r ×1
space-leak ×1