接下来,与Scala的隐式相关的特性,这是其包含在上面的原因。
与最后一条评论相关的是,隐式和类型推理结合在一起,使得Scala的类型系统是Turing完备的。也就是说,您可以将任意程序编码为类型,并在编译器在编译时“运行”。通过SKI演算表明证明可参见这里,此外还有一个“错误”的无限循环类型作为进一步证明。
上面列出的功能列表在许多方面都非常强大和令人印象深刻。但是,Scala将隐式和类型推理结合起来,在编译时生成静态证明(例如视图界限和上下文界限),这使得Scala的类型系统变得独特。据我所知,没有其他语言可以做到这一点,尽管肯定有其他语言通过其他方式提供证明能力。
List
上的sum
方法。Scala的类型系统保证只有在List
元素为数字时才会调用它。这不是Java可以做到的类型检查。我认为C++也可以做到,但是,再次提醒,C++的模板也是图灵完备的。 - Daniel C. Sobralval map = new Map[String, (String, String)]()
而不是
Map<String, Tuple<String, String>> map = new HashMap<String, Tuple<String, String>>()
val double = (x: Int) => x * 2
而不是(使用 Guava)
Function<Integer, Integer> double = new Function<Integer, Integer>() { @Override public Integer apply(Integer value) { return value * 2; }}
class IntArray(value: Array[Int]) { def sumIt = value.reduceRight(_+_) }
implicit def pimpArray(xs: Array[Int]) = new IntArray(xs)
Array(1,2,3).sumIt
这是另一个很好的资源,可以了解上述主题的一些内容:http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-5
sum
方法,它将与你定义的方法产生冲突。 - socobject
是Java中static
成员变量和方法的清晰替代品,例如,一个object
具有自己的类型并可作为参数传递type
声明:您可以为复杂类型定义别名,例如type FactorMap[A] = Map[A, Set[Int]]
最后一点是我最喜欢的之一。例如,您无法在Java中编写简单的通用函子接口。你会需要…
public interface Function<A,B> {
public B apply(A a);
}
//not valid Java
public interface Functor<C> {
public <A,B> C<B> map(Function<A,B> fn, C<A> ca);
}
如果您用像List
这样的具体类型替换C
,它就能正常工作。在Java中,您可以通过编写`List'来抽象容器的内容,但是无法抽象容器本身。相信我,我试图寻找漏洞(结果是这个)。在Scala中,这很容易:
trait Functor[C[_]] {
def map[A,B](fn: A => B, ca: C[A]):C[B]
}
object ListFunctor extends Functor[List] {
def map[A,B](fn: A => B, ca: List[A]):List[B] = ca.map(fn)
}
我不知道你是否了解Java,但是想象一下Scala的类型系统就像这样:
我本想写更多,但我的键盘刚坏了,抱歉!