Tag: 折叠

为什么没有选项有折叠方法?

我想知道为什么scala.Option没有像这样定义的方法fold : fold(ifSome: A => B , ifNone: => B) 相当于 map(ifSome).getOrElse(ifNone) 有没有比使用map + getOrElse更好?

如何将文本折叠和折叠代码块数据保存到.sublime-workspace?

似乎Sublime Text 2中没有任何function可以让文件会话之间的代码折叠close \ open。 我想写这个插件,但有一个问题。 我应该在哪里存储折叠数据,例如页面上的哪个文件或区域被折叠? 我唯一的想法保存在.sublime-workspace中 那么,我如何访问它并阅读我的属性,属性或者什么元数据呢? 我还可以在哪里存储数据,例如保留折叠区域所需的数据?

地道的build设,以检查是否订购一个集合

随着学习的意图和进一步的这个问题 ,我一直对一个algorithm检查一个列表(或集合)是否是有序的algorithm的显式recursion的惯用替代好奇。 (我通过使用运算符来比较和Int作为types来保持简单;我想在深入研究它的generics之前先看看这个algorithm) 基本的recursion版本是(by @Luigi Plinge): def isOrdered(l:List[Int]): Boolean = l match { case Nil => true case x :: Nil => true case x :: xs => x <= xs.head && isOrdered(xs) } performance不佳的地道方式是: def isOrdered(l: List[Int]) = l == l.sorted 使用fold的另一种algorithm: def isOrdered(l: List[Int]) = l.foldLeft((true, None:Option[Int]))((x,y) => (x._1 && x._2.map(_ <= y).getOrElse(true), […]

为什么在Racket中以一种奇怪的方式定义foldl?

在Haskell中,与其他许多函数式语言一样,函数foldl被定义为使得例如foldl (-) 0 [1,2,3,4] = -10 。 这是可以的,因为根据定义, foldl (-) 0 [1, 2,3,4]是((((0 – 1) – 2) – 3) – 4) 。 但是,在Racket中, (foldl – 0 '(1 2 3 4))是2,因为Racket“智能地”计算如下: (4 – (3 – (2 – (1 – 0)))) 2。 当然,如果我们定义辅助function翻转,像这样: (define (flip bin-fn) (lambda (xy) (bin-fn yx))) 那么我们可以在Racket中实现与Haskell相同的行为:而不是(foldl – 0 '(1 2 3 4))我们可以写成: […]

Haskell:一个不是Functor(或者不可穿越)的Foldable的例子?

一个Foldable实例可能是某种容器,所以也可能是一个Functor 。 事实上, 这就是说 一个Foldabletypes也是一个容器(虽然这个类在技术上并不需要Functor ,有趣的Foldable s都是Functor的)。 那么有没有一个自然是Functor或Traversable的Foldable的例子? (这也许Haskell wiki页面错过了:-))

为什么GCC对C ++ <cmath>比C <math.h>更有效地实现isnan()?

这是我的代码: int f(double x) { return isnan(x); } 如果我#include <cmath>我得到这个程序集: xorl %eax, %eax ucomisd %xmm0, %xmm0 setp %al 这是相当聪明的: ucomisd设置奇偶标志,如果x与自己的比较是无序的,这意味着x是NAN。 然后, setp将奇偶校验标志复制到结果中(只有一个字节,因此最初清除%eax )。 但是,如果我#include <math.h>我得到这个程序集: jmp __isnan 现在代码不是内联的, __isnan函数当然不会快于ucomisd指令,所以我们已经发生了跳跃,没有任何好处。 如果我将代码编译为C,我会得到同样的结果 现在,如果将isnan()调用更改为__builtin_isnan() ,则无论我包含哪个头,都可以得到简单的ucomisd指令指令,而且它也可以在C中工作。 同样,如果我只是return x != x 。 所以我的问题是,为什么C <math.h>头提供了比C ++ <cmath>头更低效率的isnan()实现? 人们是否真的希望使用__builtin_isnan() ,如果是这样,为什么? 我在x86-64上使用-O2和-O3优化testing了GCC 4.7.2和4.9.0。

日志(10.0)可以编译但日志(0.0)不能?

对于以下C源代码: #include <math.h> int main(void) { double x; x = log(0.0); return 0; } 当我用gcc -lm编译时,我得到: /tmp/ccxxANVH.o: In function `main': ac:(.text+0xd): undefined reference to `log' collect2: error: ld returned 1 exit status 但是,如果我用log(10.0)replacelog(0.0) log(10.0) ,那么它可以成功编译。 我不太明白这一点,因为无论他们是否具有math意义,他们都应该编译 – 没有语法错误。 有谁能解释这个吗? 以防万一,我的gcc -v输出: Configured with: ../src/configure -v –with-pkgversion='Ubuntu 4.8.2-19ubuntu1' –with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs –enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ –prefix=/usr –program-suffix=-4.8 –enable-shared –enable-linker-build-id –libexecdir=/usr/lib –without-included-gettext […]

如何使用Vim折叠/展开HTML标签

有一些插件在Vim中折叠HTML标签吗? 或者有另一种方法来设置折叠或展开html标签的快捷方式? 我想折叠/展开html标签,就像我用缩进折叠一样。

foldr如何工作?

任何人都可以解释foldr如何工作的? 拿这些例子来说: Prelude> foldr (-) 54 [10, 11] 53 Prelude> foldr (\xy -> (x+y)/2) 54 [12, 4, 10, 6] 12.0 我对这些处决感到困惑。 有什么build议么?

foldl是尾recursion,那么foldr怎么比foldl跑得快呢?

我想testingfoldl vs foldr。 从我看到你应该使用foldl在任何时候都可以由于尾巴reccursion优化。 这是有道理的。 但是,运行这个testing后,我很困惑: (使用时间命令需要0.057s): a::a -> [a] -> [a] ax = ([x] ++ ) main = putStrLn(show ( sum (foldr a [] [0.. 100000]))) foldl(使用时间命令时需要0.089s): b::[b] -> b -> [b] b xs = ( ++ xs). (\y->[y]) main = putStrLn(show ( sum (foldl b [] [0.. 100000]))) 很显然,这个例子是微不足道的,但是我为什么会打败foldl而感到困惑。 这不是一个明确的情况下foldl胜利吗?