是否有任何隐含的提供`some.long.expression.let(x => ...)`语法

时间:2015-01-28 01:52:16

标签: scala scalaz idiomatic

例如,我希望在我的长表达式结尾处得到x * (x - 1),而不将其分成两行并引入不必要的变量。我可以用简单的隐含来实现它:

scala> implicit class Rich[T](x: T) { def let[U](f: T => U) = f(x)}
defined class Rich

scala> List(1,2,3).map(_ + 1).sum.let(x => x * (x - 1))
res199: Int = 72

但Scala,Scalaz,Twitter Utils还是其他一些图书馆中是否存在任何内置隐含内容?

2 个答案:

答案 0 :(得分:3)

Scalaz将其作为part of its IdOps implicits。它被称为|>

long.complex(expression) |> { x => x*(x+1) }

也就是说,将所有Scalaz拉入单线程中效率有点低。

此外,不要忘记match已经以这种方式工作,只是尴尬的优先。

((long.complex(expression)) match { case x => x*(x+1) })

由于这种尴尬,它并没有好多少(尽管它比每个其他替代方案更有效,至少在优化器改进一点之前)

Some(long.complex(expression)).map(x => x*(x+1)).get

你也可以

long.complex(expression) :: Nil map (x => x*(x+1)) head

如果你愿意打开一元后缀操作符。

答案 1 :(得分:1)

我发现的最接近的方式是:

import scalaz.syntax.std.option._
scala> List(1,2,3).map(_ + 1).sum.some.map(x => x * (x - 1)).get
res201: Int = 72