在过去的一年中,我一直在编写Scala代码(来自Java背景)。我真的很喜欢如何使用val,case类,map / filter / lambda函数,隐式函数和类型推断来创建更简单,更简洁的代码。我主要将其用于基于Akka的应用程序。
今年,我和一个新团队一起在Scala项目中,他们非常喜欢函数式编程。他们大量使用Scalaz,并且代码到处都是应用程序,上下文边界,读取器/写入器/状态monad,甚至是将主要方法“包装”在I / O monad中。他们的理由是,这使编译器在断言代码正确且每个函数都没有副作用的情况下“为我们工作”。
即便如此,从我的角度来看,所有这些语法确实确实妨碍了业务逻辑。例如,可以使用“ MyBusinessObject”类型,也可以使用“ List [MyBusinessObject]”,“ Option [MyBusinessObject]”或“ Future [MyBusinessObject]”类型。它们都有明确的含义和目的。另一方面,代码如下:
def method[M[_]: Applicative] = {
case (a, b) => (ca[M](a) |@| cb[M](b)) {
case t @ (ra, rb) =>
if (ra.result && rb.result) t.right
else t.left
}
}
它会增加程序的复杂性吗?还是我不习惯这种编程方式?
>>=
和<$>
,这意味着什么,直到你知道他们做什么。但是,在了解了它们的含义之后,他们现在非常自然而迅速地向我阅读。并不是一个真正的答案,而只是我对这种事情的客观经验。我也使用Scala,但是没有使用Scalaz库的经验。
for(i=0; i<7; ++i) { trivialOperation(i); }
一些笨拙的trivialOperationCount
变量,对吗?)现在,具有模式匹配功能的编程语言有时会在其中引入更多变量只是在OO中写出访问器方法调用。结果通常更简洁;也许有点不言自明,但是查找数据声明通常会使它很快变得清晰。静态类型有很大帮助,这与APL不同。