스칼라 신화 파헤 치기
스칼라 언어에 가장 일반적으로 사용되는 기기 오해는 무엇이며, 이에 대한 반례는 무엇입니까?
최신 정보
"Scala는 동적으로 입력됩니다"및 "Scala는 스크립팅 언어입니다"와 같은 다양한 주장에 대해 더 많이 생각했습니다.
나는 "Scala is [Simple / Complex]"가 신화로 될 수있는 점을 인정하지만, 맥락에 따라 매우 의존적 인 관점이기도합니다. 제 개인적인 믿음은 Scala를 누가 사용하는지에 따라 단순하거나 복잡하게 보일 수있는 것과 동일한 기능 이라는입니다. 거기에 언어는 추상화를 제공 할 뿐이며 인식을 형성하는 데 사용되는 방식입니다.
그랬다고 주장을 불러오는 경향이 있고,이 주제에 대한 주장을 바꾸는 아직 없습니다 ...
통념 : Scala는 연산자 오버로딩을 지원합니다.
Scala는 매우 유연한 메서드 명명 규칙과 메서드 호출을위한 중위 구문을 가지고 있고, 중위 구문이 '연산자'와 함께 때 사용할 메서드 우선을 결정하기위한 특별한 규칙입니다. 이 미묘한 차이는 이 질문에 대한 James Iry의 답변에서 더 자세히 설명했듯이 실제 연산자 오버로딩 (a la C ++)에 비해이 언어 기능의 유용성과 남용 가능성에 중요한 영향을 미칩니다 .
오해 : Scala의 "Option"과 Haskell의 "Maybe"유형 은 null에서 구할 수 없습니다 . :-)
: 정체를 폭로 왜 스칼라의 "옵션"과 하스켈의 "어쩌면"유형 이James Iry에 의해 널 (null)로부터 구해줄 것입니다 .
나는 Scala가 어렵다는 주장에 동의하지 않는다. 왜냐하면 당신이 어려운 일을하기 위해 매우 진보 된 기능을 사용할 수 있기 때문입니다. Scala의 확장 성은 언어 확장에 필요한 Scala 자체에서 DSL 추상화 및 고급 API가 있음을 의미합니다. 따라서 공정하게는 Scala 라이브러리를 다른 언어 컴파일러와 비교해야합니다. 사람들은 C # 컴파일러가 꽤 뚫을 수 없기 때문에 C #이 어렵다고 말하지 않습니다. Scala의 경우 모든 것이 공개되어 있습니다. 하지만 우리는 대부분의 대부분의 코드를 필요가있는 수준에서 그렇게해야합니다.
많은 스칼라 개발자들 사이에서 생각하는 오해는 "스칼라는 단순한 언어"라는 것 입니다. 인수는 일반적으로 다음과 같이 진행됩니다.
- 스칼라에는 키워드 가 거의 없습니다.
- 스칼라 동일한는 몇 가지 구조를 재사용합니다 (예 : PartialFunction 구문 이 캐치 블록의 본문으로 사용됨).
- scala에는 라이브러리 코드를 만들 수 있는 몇 가지 간단한 규칙 이 있습니다. (언어에 특수 키워드 / 구성이있는 것처럼 보일 수 있음). 저는 여기서 암시적인 것을 생각하고 있습니다. 콜론을 포함하는 방법; 허용 된 식별자 기호; 추출기
X(a, b)
와 의 동등성a X b
. 기타 - 스칼라의 선언 사이트 분산은 유형 시스템이 당신의 길을 벗어나는 것을 의미합니다. 더 이상 와일드 카드 및
? super T
제 개인적인 의견은 이 주장이 완전하고 가짜라는 것 입니다. 암시 적 (암시 적)과 취해진 Scala의 유형 시스템 은 일반 개발자를 위해 솔직히 뚫을 수없는 코드 를 수있게 합니다. 위의 "메트릭"이 당신을 생각하게 할 수있는 것과 상관없이 그 밖의 모든 제안은 터무니없는 것입니다. ( 여기에 내가 트위터와 다른 곳에서 자바의 비고 비웃는 것을 본 사람들은 가끔 모나드, 펑터, 화살이 부족하기 전에 이해했던 매우 영리한 유형일 수 있습니다. 바지 ).
이에 대한 명백한 주장은 (물론) 다음과 가변합니다.
- 당신이하지 않는 이 같은 코드를 작성하는
- 평범한 개발자 에게 관심을 필요가 없습니다.
이 중 # 2만이 유효한 것입니다. scalaz 만큼 복잡한 코드를 작성하든 필요한 것이 든 , 유형 시스템에 대한 실제 이해없이 언어를 사용하고 계속 사용하는 것이 어리석은 일이라고 생각합니다. 다른 방법으로 언어를 최대한 활용할 수 있습니까?
통념 : 방법과 기능은 동일합니다.
사실 함수는 값 ( FunctionN
클래스 중 하나의 인스턴스 )이지만 사실입니다. Jim McBeath는 차이점을 자세히 설명 합니다. 가장 중요한 차이점은 다음과 가변적입니다.
- 메소드 만 유형 매개 변수를 사용합니다.
- 메서드 만 암시 적 인수를 사용할 수 있습니다.
- 메소드 만 명명 된 기본 매개 변수를 사용합니다.
- 메서드를 참조 할 때 메서드 호출과 부분 함수 응용 프로그램을 구분하기 위해 종종 밑줄이 필요합니다 (예 : 숫자
str.length
로str.length _
평가되고 인수가없는 함수로 평가됨).
Scala는 복잡한 언어이기 때문에 Scala는 어렵다는 신화가 있습니다.
이것은 잘못된 것입니다. 다양한 방식으로 인해 Scala는 Java 복잡하지 않습니다. (문법의 크기, 코드 줄 또는 표준 API의 클래스 수 또는 메서드 수 등)
그러나 Scala 코드가 이해하기 어렵습니다. Scala가 복잡한 언어가 아니라면 어떻게 될 수 있습니까?
대답은 Scala가 강력한 언어라는 것입니다. 하나의 특정 작업을 수행하는 많은 특수 구조 (예 : 열거 형)가 있고 그 한 가지에만 적용되는 특수 구문을 학습해야하는 Java와 달리 Scala는 매우 일반적인 구조가 다양합니다. 약간의 복잡한 아이디어를 표현할 수 있습니다. 그리고 놀랍게도, 똑같은 복잡한 아이디어를 가지고 있지 않은 누군가가 그곳에서 아주 간결한 코드로 무엇을하는지 알아 내려고하면, 두 사람을 본 것보다 훨씬 위압적이라는 것을 알게 될 것입니다. 똑같은 일을 할 수있는 코드 페이지가 많았습니다. 그 이후로 그들이 얼마나 이해해야 할 개념적인 것들이 많은지 깨달았습니다!
또한 상황이 필요한 것보다 더 복잡한 지 여부에 대한 문제도 있습니다. 예를 들어, 컬렉션 라이브러리에있는 일부 체조 유형은 컬렉션을 사용하기에는 즐겁지만 구현하거나 확장하기에는 난해합니다. ... 여기서 목표 는 특별히 복잡하지는 않지만 (예 : 서브 클래스는 자체 유형을 반환해야 함 ) 필요한 메서드 (고급 유형, 암시 적 빌더 등)는 복잡합니다. (사실 너무 복잡해서 자바는 스칼라 에서처럼 "제대로"하기보다는 포기하고 시도하지 않는다. 또한 원칙적 으로이 방법이 발전 할 수 있기 때문에 향후 개선 될 것이라는 희망이있다 . 목표에 더 가깝게 일치합니다.) 다른 경우에는 목표가 복잡합니다. list.filter(_<5).sorted.grouped(10).flatMap(_.tail.headOption)
약간 엉망이지만 5 미만의 숫자를 모두 취하고 나머지 목록에서 10 개 중 두 번째 숫자를 취하고 많게, 다소 복잡한 아이디어 일 뿐이며 코드는 기본 컬렉션 작업을 안다면 그렇습니다.
요약 : Scala는 복잡하지 않지만 복잡한 아이디어를 간결하게 표현할 수 있습니다. 복잡한 아이디어를 간결하게 표현하는 것은 어렵습니다.
Scala는 배포 할 수있는 신화가있는 반면 많은 배포 할 수 있습니다.
이 신화가 존재하는 한, 가상 머신과 API를 언어와 컴파일러에서 분리하는 데 익숙하지 않은 사람들 사이에 존재하는 것으로 생각합니다. java == javac == Java API가 마음에 든다면 누군가가 javac 대신 scalac를 사용하도록 제안하면 JVM이 얼마나 잘 실행 알기 때문에 약간 긴장할 수 있습니다.
Scala는 JVM 바이트 코드와 자체 사용자 정의 라이브러리로 끝납니다. 스칼라를 소규모로 배포하거나 다른 국가 프로젝트의 일부로 배포하는 것에 대해 더 이상 걱정할 필요가 없습니다. 선호하는 JVM과 호환되는 호환되지 않는 다른 라이브러리를 배포 할 때가 있기 때문입니다. 물론, Scala 개발 팀은 Google 컬렉션이나 Apache Commons만큼 많은 힘의 지원을받지는 않지만 Java Advanced Imaging 프로젝트와 같은 것만큼이나 비중이 높은 곳입니다.
신화 :
def foo() = "something"
과
def bar = "something"
는 ~와.
발음합니다. 호출 할 수를 foo()
있지만 bar()
인수없이 StringLike의 적용 메서드를 호출하려고 시도합니다 (오류가 발생 함).
액터 라이브러리와 관련된 몇 가지 일반적인 오해 :
- (사실, 여러 가지 메시지를 처리하는 액터 개념에 위배 및 여러 경주 조건으로 이어질 수 있습니다. (스레드 기반). 액터는 사서함 처리 및 실행 모두에 하나 액터를 사용합니다. 이벤트 기반 터는 다중 실행기를 사용하여 사서함 처리를 예약하여 실행을 위해 하나의 VM을 공유 할 수 있습니다.) )
- (사실이없는 예외는 행위자의 행동 / 상태를 변경하지 않습니다.)
통념 : 0에서 합계와 같은 것을 계산할 때 접기를 축소로 바꿀 수 있습니다.
이것은 Scala의 새로운 사용자, 특히 사전 함수 프로그래밍 경험이없는 사용자들 사이에서 흔히 발생하는 실수 / 오해입니다. 다음 표현식은 동일 하지 않습니다 .
seq.foldLeft(0)(_+_)
seq.reduceLeft(_+_)
두 표현식은 빈 시퀀스를 처리하는 방법이 다릅니다. 접기는 유효한 결과 (0)를 생성하고 축소는 예외를 발생시킵니다.
통념 : 패턴 매칭은 OO 패러다임과 잘 맞지 않습니다 .
정체를 폭로 여기 마틴 오더 스키 자신에 의해. (또한 Odersky et al 의이 백서- 패턴과 객체 일치 시키기 참조)
통념 :로 this.type
표현되는 동일한 유형을 나타냅니다 this.getClass
.
이 오해의 예를 들어, 하나의 유형은 다음 코드에서 해당 가정 할 수 v.me
입니다 B
:
trait A { val me: this.type = this }
class B extends A
val v = new B
실제로 this.type
는 유일한 인스턴스가 인 유형을 나타냅니다 this
. 일반적 x.type
으로은 유일한 인스턴스가 인 싱글 톤 유형입니다 x
. 따라서 위의 예에서 유형은 v.me
입니다 v.type
. 다음 세션은 원리를 보여줍니다.
scala> val s = "a string"
s: java.lang.String = a string
scala> var v: s.type = s
v: s.type = a string
scala> v = "another string"
<console>:7: error: type mismatch;
found : java.lang.String("another string")
required: s.type
v = "another string"
Scala에는 유형 추론 및 정제 유형 (구조 유형)이 있지만 Java에는 없습니다.
신화는 James Iry에 의해 파열 됩니다.
오해 : Scala는 어떤 형태의 확장 성을 제한하지 않고도 확장 성이 뛰어납니다.
Scala는 실제로 더 높은 수준의 표시 의미를 표현할 수있는 능력 측면에서 확장 성이 매우 높을 수 있으며, 이는 실험 및 하향식 조정 구성 의 프로젝트 수준 규모에서 생산을 확장하는 데에도 매우 좋은 언어입니다 .
그러나 모든 참조 적으로 불투명 한 언어 (즉, 변경 가능한 데이터 구조 허용)는 필수적이며 (선언적이지 않음) WAN 상향식, 조정되지 않은 구성 및 보안으로 확장되지 않습니다 . 다시 말해, 명령형 언어는 구성 (및 보안) 스파게티 wrt 조정되지 않은 모듈 개발입니다. 나는 그러한 조정되지 않은 개발이 아마도 현재 대부분의 사람들이 "파이프 드림"으로 간주되어 아마도 높은 우선 순위가 아니라는 것을 알고 있습니다. 그리고 이것은 상위 수준의 의미 통합이 제공 할 수있는 구성 성 (즉, 코너 케이스 제거)의 이점을 비난하는 것이 아닙니다 (예 : 표준 라이브러리에 대한 범주 이론 모델) .
많은 독자들에게 상당한인지 적 불협화음이있을 수 있으며, 특히 명령형 대 선언적 (즉, 변경 가능 대 불변)에 대한 대중적인 오해가 있기 때문에 내가 제기 한 문제를 완전히 이해하기 전에 "하락"투표를 조기에 누르는 경향이 있습니다. , (그리고 eager vs. lazy ) 예를 들어, 모나 딕 시맨틱은 본질적으로 절대적으로 필요 하지 않지만 그것이 사실이라는 거짓말이 있습니다 . 예, Haskell에서 IO 모나드는 필수적이지만 필수적이라는 것은 모나드와는 아무런 관련이 없습니다.
나는 홈페이지에 있거나 일시적 으로이 링크 에있는 "Copute Tutorial"과 "Purity"섹션에서 더 자세히 설명했습니다 .
내 요점은 Scala의 존재에 매우 감사하지만 Scala가 확장되는 것과 그렇지 않은 것을 명확히하고 싶습니다. 나는 그것이 잘하는 일을 위해 Scala가 필요합니다. 즉, 저에게는 새로운 선언적 언어의 프로토 타입을 만드는 이상적인 플랫폼이지만 Scala 자체는 독점적으로 선언적이지 않으며 사용을 기억하는 것 외에는 Scala 컴파일러에 의해 afaik 참조 투명성을 적용 할 수 없습니다. val
어디에나.
내 요점은 Scala에 대한 복잡성 논쟁에 적용된다고 생각합니다. 나는 (지금까지 내 새로운 언어에 대한 실제 경험이 제한 되었기 때문에 지금까지 대부분의 개념적으로) 변경 가능성과 루프를 제거하는 동시에 다이아몬드 다중 상속 하위 유형 (Haskell에는 없음) 을 유지 하면 언어가 근본적으로 단순화 된다는 사실을 발견했습니다 . 예를 들어, Unit
소설이 사라지고, 이해를 위해 비 범주 이론 표준 라이브러리와 같은 많은 다른 문제와 구성이 불필요 해집니다.
참고 URL : https://stackoverflow.com/questions/3926047/debunking-scala-myths
'ProgramingTip' 카테고리의 다른 글
UISegmentedControl의 글꼴 색상을 변경하는 방법 (0) | 2020.12.09 |
---|---|
미리 정의 된 일부 값으로 ArrayList 초기화 (0) | 2020.12.09 |
Phonegap IOS에서 오버 스크롤 / 바운스 중지 (0) | 2020.12.09 |
기본 레이아웃 배경은 무엇입니까 (0) | 2020.12.09 |
부트 만 3에서 양식을 중앙에 배치하는 방법 (0) | 2020.12.09 |