- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力学习 Haskell(为了伟大的利益),而我正在做的许多不同的事情之一就是尝试解决一些欧拉计划问题,同时我正在测试我的勇气。
在做一些基于斐波那契的问题时,我偶然发现并开始尝试斐波那契序列的递归无限列表版本:
fibs = 1 : 2 : zipWith (+) fibs (tail fibs)
对于其中一个 PE 问题,我需要提取小于 4,000,000 的斐波那契数的子序列。我决定通过列表理解来做到这一点,在我玩弄代码时,我偶然发现了一些我不太理解的东西;我假设是我对 Haskell 的惰性求值方案的掌握不够,导致事情变得复杂。
以下理解效果很好:
[x | x <- takeWhile (<= 4000000) fibs, even x]
下一个理解永远旋转;所以我经历了并将输出返回到标准输出,虽然它停在正确的位置,但它似乎只是永远继续评估递归定义的列表,而不会在达到上限值后完成;表明列表中的最后一项以逗号打印,但不存在其他列表项或右方括号:
[x | x <- fibs, x <= 4000000, even x]
那么,能够很好地处理无限列表的各种函数所使用的 secret 武器到底是什么?
最佳答案
函数takeWhile
不断获取输入列表的元素,直到到达第一个不满足谓词的元素,然后停止。只要至少有一个元素不满足谓词,takeWhile
就会将无限列表转换为有限列表。
你的第一个表情是这样的
Keep taking elements of this infinite list until you find one greater than 4,000,000 and then stop. Include each element in the output if it's even.
第二个表达式表示
Keep taking elements of this infinite list. Include each element in the output if it's less than or equal 4,000,000 and it's even.
当您观察到永远挂起的输出时,该函数正在忙于生成更多斐波那契数并检查它们是否小于或等于 4,000,000。它们都不是,这就是为什么没有任何内容打印到屏幕上,但该函数无法知道它不会在列表中进一步遇到一个小数字,因此它必须继续检查。
关于haskell - 在 Haskell 中,在此列表理解中使用 takeWhile 或使用 "regular"不等式有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13347430/
在我针对 SQL Server 2012 实例运行的以下 Linq 查询中,我尝试读取最新记录,直到之前建立的 MasterId标记(这是一个 Guid )。 var cdc = crm.CdcCon
我正在运行以下代码: val it = List(1,1,1,2,2,3,3).iterator.buffered val compare = it.head it.takeWhile(_ ==
我有一些从 Haskell 调用的用 C 语言编写的函数。这些函数返回 IO (CInt) .有时我想运行所有函数,而不管它们返回什么,这很容易。为了示例代码,这是当前正在发生的事情的一般概念: Pr
我有一个 RxJS5 管道看起来像这样 Rx.Observable.from([2, 3, 4, 5, 6]) .takeWhile((v) => { v !== 4 }) 我想保留订阅直到看到
我是 Haskell 的新手,正在尝试执行以下操作: takeWhile (length < 3) [[1],[1,2],[1..3],[1..4]] .但这给出了一个错误,我认为这是因为 takeW
我有类似以下内容: [bla z|n 1) , let z = 10*n , _ ) = ap instance Monad F w
我想要一些能够有效地执行与 TakeWhile 相同但返回两个序列的东西: TakeWhile 的结果 1. 删除了输入序列的其余部分 我知道我可以做这样的事情: var a = input.Take
如何编写一个 takeWhile 来保留第一个不符合条件的元素? 示例(显然我的示例比这更棘手): 而不是 takeWhile (\× - > x! = 3) [1..10]返回 [1,2]我需要[1
我想要一些能够有效地执行与 TakeWhile 相同但返回两个序列的东西: TakeWhile 的结果 1. 删除了输入序列的其余部分 我知道我可以做这样的事情: var a = input.Take
似乎没有 e.TakeWhile(predicate, atLeastNElements) 重载。有没有一种方便的方式来表达TakeWhile,但是,如果有>= N个元素可用的话,至少要取N个元素。?
如何使用折叠在 Haskell 中实现 takeWhile 函数? takeWhile :: (a -> Bool) -> [a] -> [a] 我尝试了一种类似于实现这样的过滤器的策略 filter
我想知道是否有办法添加根据方法 takeWhile() 的条件测试的流的最后一个元素。我相信我想实现类似于 RxJava 的 takeUntil() 方法的东西。 我猜没有直接的方法可以做到这一点(如
有 public static IEnumerable FibonacciNumbers() { long current = 0; long next = 1; while (true) {
我想在 LINQ to Objects 上使用 LINQ TakeWhile 函数。但是,我还需要知道“破坏”函数的第一个元素,即条件不成立的第一个元素。 是否有一个函数可以获取所有不匹配的对象以及第
takeWhile() 与 Java 9 中的 filter() 有何不同。它有什么额外的实用程序? Stream.of(1,2,3,4,5,6,7,8,9,10).filter(i -> i i
我正在使用 takeWhile 创建片段来探索它的可能性。与 flatMap 配合使用时,行为不符合预期。请在下面找到代码片段。 String[][] strArray = {{"Sample1",
val i = (1 to 8).toIterator val oneToThree = i.takeWhile(_ val i = (1 to 8).iterator i: Iterator[In
我看到它们(where 和 takeWhile)具有相同的功能..否则我可能会在这里漏掉一些东西! 最佳答案 documentation for Iterable.where说: Returns a
isqrt :: Integer -> Integer isqrt = floor . sqrt . fromIntegral primes :: [Integer] primes = sieve [
Javadoc指出 This is a short-circuiting stateful intermediate operation. 有状态的定义来自 Javadoc : Stateful op
我是一名优秀的程序员,十分优秀!