나는 박사 학위가 없으며 CS 나 수학 또는 다른 분야에서도 학위가 없습니다. 스칼라 나 다른 유사한 언어에 대한 사전 경험이 없습니다. 원격으로 비교 가능한 유형의 시스템조차 경험이 없습니다. 사실, 심지어 어느 단지 피상적 인 지식보다 더 가지고있는 유일한 언어 가 타입 시스템은 정확히 정교한 타입의 시스템에 알려져 있지 파스칼이다. (가 있지만 않습니다 AFAIK 꽤 많이 다른 언어가 범위 유형을 가지고 있지만, 여기서는 정말 관련이 없습니다.) 내가 아는 다른 3 개 국어 심지어 타입 시스템이 어느 것도 BASIC, 스몰 토크와 루비입니다.
그럼에도 불구하고 나는 map
당신이 게시 한 기능 의 서명을 전혀 이해하지 못했습니다 . 그것은 map
내가 본 모든 다른 언어로 된 것과 거의 동일한 서명처럼 보입니다. 차이점은이 버전이 더 일반적이라는 것입니다. Haskell보다 C ++ STL과 비슷합니다. 특히,이 인수는을 요구하여 콘크리트 수집 유형 IterableLike
에서 추상화하고, 결과 값 모음에서 무언가 를 생성 할 수있는 암시 적 변환 함수 만 필요로함으로써 콘크리트 반환 유형에서 추상화 합니다. 예, 그것은 매우 복잡하지만 실제로는 일반 프로그래밍의 일반적인 패러다임의 표현 일뿐입니다. 실제로 필요하지 않은 것은 가정하지 마십시오.
이 경우 map
실제로 는 컬렉션이 목록이거나 순서가 있거나 정렬 가능하거나 이와 비슷한 것이 될 필요 는 없습니다 . map
관심 이있는 유일한 것은 컬렉션의 모든 요소에 차례로 액세스 할 수 있지만 특별한 순서는 없다는 것입니다. 결과 컬렉션이 무엇인지 알 필요가 없으며 컬렉션을 만드는 방법 만 알면됩니다. 이것이 타입 시그니처에 필요한 것입니다.
그래서 대신
map :: (a → b) → [a] → [b]
있는 전통적인 형태의 서명이다 map
, 그것은 콘크리트를 필요로하지에 일반화 List
아니라, 단지 IterableLike
데이터 구조
map :: (IterableLike i, IterableLike j) ⇒ (a → b) → i → j
그런 다음 결과를 사용자가 원하는 데이터 구조 로 변환 할 수있는 함수 만 있으면됩니다 .
map :: IterableLike i ⇒ (a → b) → i → ([b] → c) → c
문법이 약간 복잡하지만 시맨틱은 동일합니다. 기본적으로
def map[B](f: (A) ⇒ B): List[B]
에 대한 전통적인 서명입니다 map
. (Scala의 객체 지향적 특성으로 인해 입력 목록 매개 변수가 이제 단일 디스패치 OO 시스템의 모든 메소드가 갖는 암시 적 수신자 매개 변수이기 때문에 어떻게 사라지는 지 확인하십시오. 그런 다음 콘크리트 List
에서보다 일반적인 것으로 일반화했습니다.IterableLike
def map[B](f: (A) ⇒ B): IterableLike[B]
이제 IterableLike
결과 콜렉션을 실제로 거의 모든 것을 생성 하는 함수로 대체합니다 .
def map[B, That](f: A ⇒ B)(implicit bf: CanBuildFrom[Repr, B, That]): That
어떤 정말 생각없는 것을 열심히 이해. 실제로 필요한 몇 가지 지적 도구가 있습니다.
- 당신은 (대략) 무엇인지 알아야
map
합니다. 메소드의 이름이없는 유형 서명 만 주면 어떤 일이 일어나고 있는지 파악하기가 훨씬 어려울 것입니다. 하지만 당신은 이미부터 알고 무엇을 map
신속, 이상 현상의 서명과 초점을 검색 할 수 있습니다, 어떻게해야한다, 당신은 그 타입의 서명이 있어야하는데 무엇인지와 같은 "왜합니까 map
인수로 두 가지 기능이 아니라 하나의 테이크를?"
- 실제로 유형 서명을 읽을 수 있어야합니다 . 그러나 이전에 Scala를 본 적이 없어도 실제로 다른 언어에서 이미 알고있는 유형 구문의 혼합이기 때문에 매우 쉽습니다 .VB.NET은 매개 변수 다형성에 대괄호를 사용하고 화살표를 사용하여 이름과 형식을 구분하는 반환 형식과 콜론은 실제로 표준입니다.
- 일반적인 프로그래밍이 무엇인지 대략 알아야합니다. (하지 않는 것을 그것은 기본적으로 모든 이름에서 철자 이후 하드는 파악하기 : 말 그대로 그냥 일반적인 방식으로 프로그래밍 것).
이 세 가지 중 어느 것도 전문 또는 취미 애호가 프로그래머에게 심각한 두통을주지 않아야합니다. map
지난 50 년 동안 디자인 된 거의 모든 언어에서 표준 기능으로 사용되었습니다. HTML과 CSS를 사용하여 웹 사이트를 디자인 한 사람에게는 다른 언어가 다른 구문을 가지고 있다는 사실이 분명하므로 원격 프로그래밍도 구독 할 수 없습니다. St. Stepanov 교회의 성가신 C ++ 팬 보이가없는 관련 메일 링리스트는 일반 프로그래밍의 장점을 설명합니다.
예, 스칼라 는 복잡합니다. 예, 스칼라는 Haskell, Miranda, Clean 또는 Cyclone과 같은 언어를 능가하고 심지어 능가하는 사람에게 알려진 가장 정교한 유형 시스템 중 하나입니다. 그러나 프로그래밍 언어의 성공에 대한 복잡성이 논쟁의 여지가 있다면 C ++은 오래 전에 죽었을 것이며 우리는 모두 Scheme을 작성할 것입니다. 스칼라가 성공하지 못하는 데는 여러 가지 이유가 있지만, 키보드 앞에 앉기 전에 프로그래머가 두뇌를 켜는 데 방해가 될 수 없다는 사실은 아마도 주요한 것이 아닐 것입니다.