相关疑难解决方法(0)

如何在Python中实现有效的素数无限生成器?

这不是作业,我只是好奇.

INFINITE是这里的关键词.

我希望在primes()中使用它作为p.我相信这是Haskell中的内置函数.

所以,答案不能像"Just do a Sieve"那样天真.

首先,您不知道将消耗多少连续素数.好吧,假设你可以一次编制100个.您是否会使用相同的Sieve方法以及素数公式的频率?

我更喜欢非并发方法.

感谢您阅读(和写作;))!

python primes generator

60
推荐指数
5
解决办法
2万
查看次数

解释这一块输出素数流的haskell代码

我无法理解这段代码:

let
  sieve (p:xs) = p : sieve (filter (\ x -> x `mod` p /= 0) xs)
in sieve [2 .. ]
Run Code Online (Sandbox Code Playgroud)

有人可以为我分手吗?我知道它有递归,但这就是问题我无法理解这个例子中的递归是如何工作的.

primes haskell lazy-evaluation

19
推荐指数
3
解决办法
3434
查看次数

为什么GHC让修复如此混乱?

看一下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)

所以现在我有两个问题:

  1. 如何X真的来临意味着修复X中的第一个定义?
  2. 在第二个定义中使用第一个定义是否有任何优势?

recursion haskell fixpoint-combinators

15
推荐指数
4
解决办法
767
查看次数

双流馈送以防止不必要的记忆?

我是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

9
推荐指数
1
解决办法
374
查看次数

递归如何满足基本情况Haskell

我试图理解这段代码,该代码返回[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告诉我们它首先映射了函数,然后将列表连接起来,正如我所看到的,我们已经在函数内部进行了此操作?

任何宝贵的意见将不胜感激?

recursion haskell list

8
推荐指数
1
解决办法
193
查看次数

按需调用的简单示例

我正试图理解"按需召唤"背后的定理.我理解这个定义,但我有点困惑.我想看一个简单的例子,它显示了按需调用的方式.

在阅读了一些以前的线程之后,我发现Haskell使用了这种评估.是否有其他编程语言支持此功能?

我读到了Scala的名字调用,我确实知道按名称调用和按需调用是相似的,但由于需要调用将保持评估值这一事实不同.但我真的很想看到一个真实的例子(它没有必须在Haskell),这表明调用 - 需要.

haskell r lazy-evaluation call-by-need

5
推荐指数
1
解决办法
280
查看次数