什么是Scala的seq.reduceOption的Clojure等价物?

haw*_*eye 2 reduce scala clojure

在Scala的Collections库中 - 我们看到具有reduceOption方法的Seq类:

def reduceOption[A1 >: A](op: (A1, A1) ? A1): Option[A1]
Run Code Online (Sandbox Code Playgroud)

使用指定的关联二元运算符减少此序列的元素(如果有)."

这有另一个很好的解释:

这里谈到reduceOption保存一天!如果reduce因为集合是空会失败,它只会返回一个None,而是和一个Some(returnvalue)用于非空的集合.

我的问题是:Scala的seq.reduceOption的Clojure相当于什么?

Art*_*ldt 8

它简称为reduce:

user> (reduce + (range 1e6))
499999500000  

user> (reduce + [])
0
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,零的结果来自于加法的标识值为零的事实,因此如果您调用+没有参数的函数,它将返回0.因为*返回值将是1.这要求您传递的函数能够处理使用零个,一个或两个参数调用的函数.您可以通过将初始值指定为第三个参数来防止此行为,在这种情况下,如果列表为空,则永远不会调用reduce函数.

user> (reduce * -1 [])
-1 
Run Code Online (Sandbox Code Playgroud)

Reduce在调用支持此类的集合(如向量)时也使用forkjoin框架.

  • `(reduce str ["this""is""stringy"])` - >"thisisstringy"`(reduce str [])` - >"" (2认同)
  • @RandallSchulz为了回答你的问题,`+`被重载以处理整个数字塔 - 整数,浮点数,有理数,BigInts,BigDecimals等 - 例如`(reduce + [1/2 1/3 1/5 ]); => 31/30`.对于这些中的每一个,"0"是加法中的标识元素,这就是为什么`(+)`和`(reduce + [])`产生'0'的原因.在这个意义上,"0"被重载,因为它被添加到另一个时自动强制转换为正确的类型0,0.0,0/1等.Clojure不会超载`+`也意味着字符串连接.字符串连接的标识元素是空字符串,因此`(str)=>""`. (2认同)