scala - 튜토리얼 - 스칼라의 "강력한"타입 시스템은 무엇입니까?




스칼라 튜토리얼 (4)

Java를 알고 있는지 모르겠지만 스칼라의 타입 시스템을 다음과 같이 상상해보십시오 :

  • 유형 및 제네릭으로 할 수있는 것에 대한 Java의 인위적 제한 제거
  • 함수형 언어의 일반적인 기능을 추가
  • oop / 상속에 대한 혁신

나는 wrie을 더 좋아할 것이다, bu 나의 키보드 jus는 부서졌다, 미안하다!

스칼라가 논의 될 때, 타입 시스템은 항상 주요 특징 중 하나로 언급됩니다. 그것은 강력하고 언어 모국어의 주된 이유입니다 (Scala는 "scalable language"의 약자입니다). 누군가가 스칼라 타이핑이 어떻게 작동하는지 설명해 주실 수 있습니까? 왜이 독특하고 확장 가능한 언어에 어떻게 기여합니까?


schmmd의 탁월한 대답 외에도 Scala의 유형 시스템에는 더욱 중요한 기능이 있습니다.

  • object 는 자바의 static 멤버 변수와 메소드에 대한 깨끗한 대안입니다. 예를 들어, object 는 자체 유형을 가지며 인수로 전달 될 수 있습니다
  • type 선언 : type FactorMap[A] = Map[A, Set[Int]] 와 같은 복잡한 타입에 대한 별칭을 정의 할 수 있습니다 type FactorMap[A] = Map[A, Set[Int]]
  • 일반 스타일 유형에 대한 대안으로서 추상 유형 멤버
  • 자기 유형
  • 구조 유형
  • currying을위한 다중 인수 목록
  • 뷰 경계와 함 2 암시 적 매개 변수 W 변환. 이것은 "포이 내 라이브러리"패턴으로 이어지고 하스켈 스타일의 타이 틀을 시뮬레이트하는 데 사용될 수 있습니다
  • 고차 수주 유형

마지막 요점은 내가 좋아하는 것 중 하나이다. 예를 들어 자바에서 간단한 일반 펑터 인터페이스를 작성할 수는 없습니다. 너 필요할 거야 ...

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);
}

C 대신 List 와 같은 특정 유형을 대체하는 경우 작동합니다. 자바에서는 containter의 내용을 (예 :`List) 작성하여 추상화 할 수 있지만 컨테이너 자체에서 추상화 할 수는 없습니다. 저를 믿으십시오, 나는 허점을 찾아내는 것을 시도했다 (결과는 this 이었다). 스칼라에서 그것은 산들 바람입니다.

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)
}


자바보다 스칼라 유형 시스템의 몇 가지 장점 :

  1. 형식은 명시 적으로 지정하는 대신 많은 경우 유추 할 수 있습니다. 이는 더 편리하지만 복잡한 유형의 사용을 촉진합니다.

    val map = new Map[String, (String, String)]()

    대신에

    Map<String, Tuple<String, String>> map = new HashMap<String, Tuple<String, String>>()

  2. 함수는 형식 시스템에서 간단히 표현할 수 있습니다. 이것이 얼마나 강력한지를보고 싶다면, 구아바 라이브러리를 자바의 해결 방법으로 생각해보십시오. 엄청나게 제한적이고 장황합니다 (그러나 여전히 유용합니다).

    val double = (x: Int) => x * 2

    대신 (구아바 사용)

    Function<Integer, Integer> double = new Function<Integer, Integer>() { @Override public Integer apply(Integer value) { return value * 2; }}

  3. 튜플은 Scala에서 하나의 값을 반환 할 수있는 Java의 문제를 피하는 유형입니다.

  4. 스칼라는 Variances 형식을 지원하므로 Cat이 Thing의 하위 유형이거나 역관계가 유지되는 경우 SomeObject가 SomeObject의 하위 유형임을 지정할 수 있습니다. 자바에서는 generics가 공변 적이 지 않다 . 종종 문제가있다.

  5. Scala는 traits 사용하여 제한된 다중 상속을 지원합니다. 인터페이스 (Java에서 구현할 수있는 다중 인터페이스)와 달리 특성은 메소드 및 변수를 정의 할 수 있습니다.

  6. 배열은 다른 클래스처럼 투명하게 처리됩니다.

  7. 암시 적 정의를 통해 기존 클래스메소드를 추가 할 수 있습니다. 예를 들어 정수 배열에 "sum"메서드를 추가 할 수 있습니다.

    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







types