복붙노트

[SCALA] 스칼라 2.8 컬렉션 라이브러리는 "역사에서 가장 긴 유서"의 경우인가? [닫은]

SCALA

스칼라 2.8 컬렉션 라이브러리는 "역사에서 가장 긴 유서"의 경우인가? [닫은]

난 그냥 임박 2.8 릴리스에서오고있다 스칼라 컬렉션 라이브러리를 다시 구현을보고하기 시작했다. 2.7에서 라이브러리에 익숙한 사람들은 도서관, 사용법 관점에서, 약간의 변경되었음을 알 수 있습니다. 예를 들어 ...

> List("Paris", "London").map(_.length)
res0: List[Int] List(5, 6)

... 두 버전에서 작동합니다. 도서관은 탁월하게 사용 가능한입니다 : 사실은 환상적이다. 그러나, 스칼라와 이전에 익숙 주위 파고 사람들은 지금과 같은 메소드 서명의 의미를해야하는 언어에 대한 느낌을 얻을 수 있습니다 :

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That

같은 간단한 기능의 경우,이 내가 자신을 이해하는 데 어려움을 겪고 찾기 어려운 서명 하나입니다. 나는 그것의 제작자가 시장을 목표로했다 생각하지 않는다 - - 나는 스칼라 (또는 / C / C ++ / C #을) 다음 자바 될 그 어느 것 같았다 생각하지하지만 내가 생각 / 확실히 가능했다 스칼라가되기위한 다음 루비 나 파이썬 (즉 중요한 상업 사용자 기반을 확보하기 위해)

스티브 예그 한 번 그가 그 overcomplicated 형 시스템으로 본 것에 대해 스칼라을 (잘못 내 의견으로는) 공격했다. 나는 누군가가 (유사 조쉬 블로흐 자바에 클로저를 추가 밖으로 JCP 깜짝 놀라게하는 방법으로)이 API를 사용하여 필드 하루 확산 FUD를 위하여려고하고 있다는 것을 우려하고있다.

내가 제안이 실수를 표현 그의 정직-신념 이외의 다른이를 돌리는하지 않는 내가 조슈아 블로흐는 BGGA 클로저 제안의 거부에 영향력이라고 생각하는 동안, 명확해야한다 - 참고.

내가 옥스퍼드 대학에서 수학에서 좋은 학위를 가지고 있고, 나는 약 거의 12 년 동안과 스칼라에서 상업적으로 프로그래밍 봤는데 : 내 아내와 동료가 말해 계속 어떤에도 불구하고, 나는 내가 바보라고 생각하지 않는다 년 (또한 상업적으로).

염증 제목 제목은 1980 년대 초에 영국 정당의 선언에 대해 만든 인용 참고. 이 질문은 주관적이지만 진짜 문제이다, 나는 그것이 CW했습니다 나는이 문제에 대한 몇 가지 의견을 싶습니다.

해결법

  1. ==============================

    1.나는 그것이 아닌 "유서"희망,하지만 난 당신의 지점을 볼 수 있습니다. 확장 성 : 당신은 같은 시간 강도와 스칼라의 문제 모두에 무엇에 명중했다. 이것은 우리가 도서관에서 대부분의 주요 기능을 구현할 수 있습니다. 다른 언어에서는,지도와 같은 뭔가 시퀀스 또는 수집이 내장 될 것이며, 아무도 그들을 원활하게 작동하도록 컴파일러가 통과하는 모든 농구를 볼 수 없습니다. 스칼라에서는 모든 라이브러리, 따라서 오픈에서 밖으로이다.

    나는 그것이 아닌 "유서"희망,하지만 난 당신의 지점을 볼 수 있습니다. 확장 성 : 당신은 같은 시간 강도와 스칼라의 문제 모두에 무엇에 명중했다. 이것은 우리가 도서관에서 대부분의 주요 기능을 구현할 수 있습니다. 다른 언어에서는,지도와 같은 뭔가 시퀀스 또는 수집이 내장 될 것이며, 아무도 그들을 원활하게 작동하도록 컴파일러가 통과하는 모든 농구를 볼 수 없습니다. 스칼라에서는 모든 라이브러리, 따라서 오픈에서 밖으로이다.

    사실 그 복잡한 유형에서 지원있어지도의 기능은 매우 고급입니다. 이걸 고려하세요:

    scala> import collection.immutable.BitSet
    import collection.immutable.BitSet
    
    scala> val bits = BitSet(1, 2, 3)
    bits: scala.collection.immutable.BitSet = BitSet(1, 2, 3)
    
    scala> val shifted = bits map { _ + 1 }
    shifted: scala.collection.immutable.BitSet = BitSet(2, 3, 4)
    
    scala> val displayed = bits map { _.toString + "!" }
    displayed: scala.collection.immutable.Set[java.lang.String] = Set(1!, 2!, 3!)
    

    당신은 항상 최선의 유형을 얻는 방법을 참조하십시오 당신의 int로 int 치의 매핑 경우에 당신은 다시 BitSet를 얻을 수 있지만, 문자열의 int를 매핑하는 경우, 당신은 일반적으로 세트를 가져옵니다. 정적 유형과지도의 결과의 런타임 표현은 모두 여기에 전달되는 함수의 결과 유형에 따라 달라집니다. 그리고 이것은 세트가 비어 있으므로 기능이 적용되지 않을 경우에도 작동합니다! 내가 아는 한 동등한 기능을 가진 다른 제품 수거 규정이 없다. 그러나 사용자의 관점에서이 일이 일을 해야하는 방법이다.

    우리가 가진 문제는 이런 일이 만드는 모든 영리한 기술이 크고 무서운 될 유형 서명에 누수 때문이다. 하지만 어쩌면 사용자는 기본적으로 맵의 전체 형식 서명을 표시하지 않겠습니까? 그녀는 비트 세트에지도를보고하는 경우에 대해 그녀는 어떻게 가지고 :

    map(f: Int => Int): BitSet     (click here for more general type)
    

    워드 프로세서 때문에 실제로지도 유형 (INT => INT) => 비트 세트를 가진 사용자의 관점에서,이 경우에 거짓말을하지 않을 것입니다. 그러나지도는 또 다른 링크를 클릭하여 검사 할 수있는보다 일반적인 유형이 있습니다.

    우리는 아직 우리의 도구에이 같은 기능을 구현하지 않았습니다. 그러나 나는 우리가 사람을 무서워하지 않도록 더 유용한 정보를 제공하기 위해,이 작업을 수행 할 필요가 생각합니다. 그런 도구를 잘하면 스마트 프레임 워크와 라이브러리는 자살 노트가되지 않습니다.

  2. ==============================

    2.나는 박사도 CS 정도도 다른 어떤 종류도 수학이나 실제로 다른 어떤 분야가 없습니다. 나는 스칼라이나 다른 유사한 언어에 대한 사전 경험이 없다. 심지어 원격으로 비슷한 유형의 시스템과 경험이 없다. 사실, 심지어 유형의 시스템을 가지고있는 단지 피상적 인 지식보다 더 많은 수있는 유일한 언어는 정확히 정교한 타입의 시스템에 알려져 있지 파스칼이다. (이 AFAIK 꽤 많이 다른 언어가없는 범위 유형을 가지고 있지만,하지만 그것은 여기 정말 관련이 없습니다.) 내가 아는 다른 3 개 국어는 기본이고, 심지어 유형의 시스템을 가지고 어느 것도 스몰 토크와 루비.

    나는 박사도 CS 정도도 다른 어떤 종류도 수학이나 실제로 다른 어떤 분야가 없습니다. 나는 스칼라이나 다른 유사한 언어에 대한 사전 경험이 없다. 심지어 원격으로 비슷한 유형의 시스템과 경험이 없다. 사실, 심지어 유형의 시스템을 가지고있는 단지 피상적 인 지식보다 더 많은 수있는 유일한 언어는 정확히 정교한 타입의 시스템에 알려져 있지 파스칼이다. (이 AFAIK 꽤 많이 다른 언어가없는 범위 유형을 가지고 있지만,하지만 그것은 여기 정말 관련이 없습니다.) 내가 아는 다른 3 개 국어는 기본이고, 심지어 유형의 시스템을 가지고 어느 것도 스몰 토크와 루비.

    그럼에도 불구하고, 난 당신이 게시 된지도 기능의 서명을 이해 전혀 문제가 없습니다. 이지도는 다른 모든 언어 내가 본 것을 거의 동일한 서명처럼 나에게 보인다. 차이점은이 버전이 더 일반적인 것입니다. 그것은 더 하스켈, 말,보다 C의 ++의 STL 것처럼 보인다. 특히, 그것은 단지 인수가 IterableLike, 또한 단지 암시 적 변환 함수는 결과 값의 수집 무언가를 만들 수있는 존재한다는 것을 요구함으로써 멀리 콘크리트 반환 형식에서 추상화 것을 요구함으로써 멀리 구체적인 수집 유형에서 추상화합니다. 네, 매우 복잡하지만 정말 제네릭 프로그래밍의 일반적인 패러다임의 표현이다 : 당신이 실제로 필요가 없습니다 아무것도 생각하지 않습니다.

    이 경우,지도는 실제로 목록으로 컬렉션을 필요로하지 않는다, 또는 같은 정렬 또는 아무것도되는 명령이나된다. 그지도에 대한 관심있는 유일한 방법은 수집, 하나씩의 모든 요소에 액세스 할 수 있지만, 특별한 순서없이 할 수 있다는 것입니다. 그리고 그것은 단지를 구축하는 방법을 알 필요가있다, 그 결과 수집이 무엇인지 알 필요가 없습니다. 그래서, 그 유형 서명이 요구하는 것입니다.

    그래서, 대신

    map :: (a → b) → [a] → [b]
    

    어떤 맵의 전통 타이프 시그니쳐이며, 구체적인 목록을 필요로하지 일반화 아니라 단지 IterableLike 데이터 구조입니다

    map :: (IterableLike i, IterableLike j) ⇒ (a → b) → i → j
    

    이는 다음 더 만 기능 즉, 사용자가 원하는 어떤 데이터 구조에 대한 결과를 변환 할 수있는 것을 요구함으로써 일반화 :

    map :: IterableLike i ⇒ (a → b) → i → ([b] → c) → c
    

    I 구문은 비트 clunkier 것을 인정하지만, 의미는 동일하다. 기본적으로,에서 시작

    def map[B](f: (A) ⇒ B): List[B]
    

    어떤 맵에 대한 기존의 서명입니다. (지금 단일 파견 OO 시스템의 모든 방법이 암시 수신기 매개 변수이기 때문에, 입력 목록 매개 변수가 사라 방법으로 인해 스칼라의 객체 지향 특성으로합니다.) 그 다음이 이상 구체적인 목록에서 일반화 일반 IterableLike

    def map[B](f: (A) ⇒ B): IterableLike[B]
    

    지금, 그것은 정말 아무것도, 아니라, 생성하는 기능으로 IterableLike 결과 모음을 대체합니다.

    def map[B, That](f: A ⇒ B)(implicit bf: CanBuildFrom[Repr, B, That]): That
    

    정말 생각하는 이해하기 어려운 일이 아니다. 당신이 필요로하는 지적 도구의 몇 정말있다 :

    이 세 가지 중 어느 것도 어떤 직업 또는 취미 프로그래머에게 심각한 두통을주지해야한다. 지도는 지난 50 년에 설계 거의 모든 언어에서 표준 기능이있다, 사실 다른 언어는 다른 구문은 HTML과 CSS로 웹 사이트를 디자인 한 사람에게 분명해야 그리고 당신은 심지어 원격으로 가입 할 수 없음 제네릭 프로그래밍의 장점을 설명 세인트 Stepanov의 교회에서 몇 가지 짜증나는 C ++ 팬보이없이 관련 메일 링리스트를 프로그래밍.

    예, 스칼라는 복잡하다. 예, 스칼라는 하스켈, 미란다, 청소 또는 사이클론 같은 언어를 능가도 필적하고, 인간에게 알려진 가장 정교한 형태의 시스템 중 하나가 있습니다. 복잡성은 프로그래밍 언어의 성공에 대한 인수가 있다면 그러나, C ++은 오래 전에 죽었을 것입니다 우리 모두는 계획을 작성하는 것입니다. 이 스칼라 매우 가능성이 성공하지 못할 것입니다 많은 이유가 있지만, 프로그래머가 키보드 앞에 앉아 전에 자신의 두뇌를 켭 방해 할 수 없다는 사실은 아마 메인 하나 될 수 없습니다.

  3. ==============================

    3.C ++에서 같은 일이 :

    C ++에서 같은 일이 :

    template <template <class, class> class C,
              class T,
              class A,
              class T_return,
              class T_arg
                  >
    C<T_return, typename A::rebind<T_return>::other>
    map(C<T, A> &c,T_return(*func)(T_arg) )
    {
        C<T_return, typename A::rebind<T_return>::other> res;
        for ( C<T,A>::iterator it=c.begin() ; it != c.end(); it++ ){
            res.push_back(func(*it));
        }
        return res;
    }
    
  4. ==============================

    4.또는 거의 정규 스택 오버플로 사용자 - - 규칙하지 글쎄, 난 당신과 나 같은 사람들은, 솔직히, 당신의 고통을 이해하지만 할 수 있습니다.

    또는 거의 정규 스택 오버플로 사용자 - - 규칙하지 글쎄, 난 당신과 나 같은 사람들은, 솔직히, 당신의 고통을 이해하지만 할 수 있습니다.

    내가 그 뜻은 그들을 볼 수 없을 것이기 때문에 대부분의 프로그래머는, 해당 유형 서명을 걱정하지 않습니다 ...입니다! 그들은 문서를 읽을 수 없습니다.

    로 그들이 코드가 작동하고, 코드가 그들이 기대하는 결과를 생산을 실패하지 않는 방법에 대한 몇 가지 예를보고, 그들은 지금까지 문서에 보이지 않는 것입니다. 이 실패하면, 그들은 문서를보고 상단에있는 예문을 기대할 수 있습니다.

    마음에 이러한 것들로, 나는 생각 :

    아아, 자바 프로그래머는 그냥 주류 스칼라 채택 내 기대를 개정 한 것으로 응답에서, 전동 공구에 많은, 그래서. 나는 스칼라가 주류 언어이 될 것이라고 전혀 의심의 여지가있다. 아니 C 주류, 그러나 아마 펄 주류 또는 PHP 주류.

    혹시 클래스 로더를 교체 않았다, 자바의 말하기? 혹시 그 포함 무엇으로 봤어? 당신이 프레임 워크 작가가 할 장소를 보면 자바, 무서운 될 수 있습니다. 그것은 대부분의 사람들이하지 않는 단지입니다. 같은 일이 스칼라, 이럴 적용되지만 얼리 어댑터가 숨어 뭔가가 있는지, 그들이 발생하는 각 바위 밑에 보는 경향이 있습니다.

  5. ==============================

    5.네,하지만 그것은 또한 연기되는 사람을 방지 할 수 있습니다. 나는 스칼라가 높은 kinded 유형에 대한지지를 얻은 이후로 큰 약점으로 높은 kinded 유형을 사용하는 컬렉션의 부족을 고려했습니다. 그것은 API 문서가 더 복잡하게,하지만 정말 사용이 더 자연스러운 있습니다.

    네,하지만 그것은 또한 연기되는 사람을 방지 할 수 있습니다. 나는 스칼라가 높은 kinded 유형에 대한지지를 얻은 이후로 큰 약점으로 높은 kinded 유형을 사용하는 컬렉션의 부족을 고려했습니다. 그것은 API 문서가 더 복잡하게,하지만 정말 사용이 더 자연스러운 있습니다.

    일부는 아마 것이다. 나는 스칼라가 부분적으로 스칼라의 복잡성과 부분적으로 많은 개발자의 의지가 학습하는, 많은 "전문가"개발자에 액세스 할 수 있다고 생각하지 않습니다. 같은 개발자를 고용의 CTO는 당연히 겁됩니다.

    물론. 이 컬렉션은 여전히 ​​약간 거친 가장자리가 있더라도, 언어의 휴식과 유형 시스템에 훨씬 더 적합합니다.

    나는 상업적으로 사용하지 않을거야. 적어도 몇 심지어 버그 플러시 할 수 있도록 소개 시도하기 전에 2.8.x 시리즈에 회전 속도를 올린다 때까지 아마 기다릴 것이다. 또한 EPFL은 릴리스 프로세스 개발 개선에 얼마나 많은 성공을보고 기다릴 수 있습니다. 내가보고하고있어 희망이 보인다,하지만 난 보수적 인 회사를 위해 일한다.

    하나의 일반적인 주제는 "주류 개발자를위한 너무 복잡 스칼라인가?"...

    주류 또는 다른 대부분의 개발자는 유지하거나 기존 시스템을 확장하고 있습니다. 이것은 그들이 무엇을 사용의 대부분은 오래 전에 내린 결정에 의해 결정된다는 것을 의미한다. COBOL을 작성하는 많은 사람들은 여전히있다.

    내일의 주류 개발자는 유지하고 현재 건설되고있는 응용 프로그램을 확장 작동합니다. 이러한 응용 프로그램의 대부분은 주류 개발자가 구축되지 않습니다. 내일의 주류 개발자들은 새로운 애플리케이션의 오늘날 가장 성공적인 개발자들에 의해 사용되는 언어를 사용합니다.

  6. ==============================

    6.작은 규모로 시작하여 점차적으로 더 큰 성장 많은 예제 - 스칼라 커뮤니티 스칼라 새로운 프로그래머의 두려움을 완화 도움이 될 수있는 한 가지 방법은 연습에 집중하고 모범을 가르치는 것입니다. 다음은이 방법을 몇 가지 사이트는 다음과 같습니다

    작은 규모로 시작하여 점차적으로 더 큰 성장 많은 예제 - 스칼라 커뮤니티 스칼라 새로운 프로그래머의 두려움을 완화 도움이 될 수있는 한 가지 방법은 연습에 집중하고 모범을 가르치는 것입니다. 다음은이 방법을 몇 가지 사이트는 다음과 같습니다

    이러한 사이트에서 약간의 시간을 소비 한 후, 하나는 신속하게 스칼라와 라이브러리, 설계 및 구현 아마도 어려운 있지만, 특히 일반적인 경우에 사용하기 너무 어려운 아니라는 것을 깨닫는다.

  7. ==============================

    7.나는 미국 대학 싼 "대중 시장"에서 학사 학위를, 그래서 난 그냥 몇 달 동안 스칼라와 취미 삼아 왔습니다 :) 확장 I은 사용자 정보의 중간에 해당 (또는 적어도 교육)라고 말하고 싶지만 두 개 또는 세 개의 사소하지 않은 응용 프로그램에서 일했다.

    나는 미국 대학 싼 "대중 시장"에서 학사 학위를, 그래서 난 그냥 몇 달 동안 스칼라와 취미 삼아 왔습니다 :) 확장 I은 사용자 정보의 중간에 해당 (또는 적어도 교육)라고 말하고 싶지만 두 개 또는 세 개의 사소하지 않은 응용 프로그램에서 일했다.

    특히 지금 인 IntelliJ는 이럴 현재 최고의 스칼라 플러그인이 무엇인지 자신의 좋은 IDE를 출시했다고 스칼라 개발은 상대적으로 고통입니다 :

    초보자로서, 나는 간결하고 관용적 구문 투쟁을 계속합니다. 방법은 그들이 할 경우를 제외하고 괄호를 필요로하지 않는 매개 변수없이 호출; 경기 문의의 경우는 지방 화살표 (=>)가 필요합니다,하지만 당신은 얇은 화살표 필요한 곳도 있습니다 (->)가. 많은 방법이 같은 짧은 아니라 암호 같은 이름이 / : 또는 \ : - 내가 충분히 매뉴얼 페이지를 플립 만약 내가 내 물건을 끝낼 수 있지만, 내 코드의 일부는 펄 또는 라인 노이즈처럼 보이는 끝납니다. 아이러니하게도, 구문 속기의 가장 인기있는 비트 하나의 작업에서 누락되었습니다 나는 계속 지능은 ++ 방법을 정의하지 않는다는 사실에 의해 물리지.

    이건 그냥 제 의견입니다 : 스칼라는 C ++의 복잡성과 가독성과 함께 C의 힘을 ++가 같은 느낌. 언어의 구문 복잡성은 읽기 API 문서 열심히합니다.

    스칼라는 매우 잘 생각하고 여러면에서 훌륭합니다. 나는 학자가에서 프로그램 싶어요 많은 생각한다. 그러나, 그것은 자바보다 훨씬 높은 학습 곡선을 가지고 있으며, 읽기 어렵습니다, 영리 및 개는의도 가득. 난 아직도 자바의 미세한 점으로 어려움을 겪고 얼마나 많은 개발자 포럼을 검색하고 볼 경우에, 나는 스칼라가 지금까지 주류 언어가되고 상상할 수 없습니다. 이전에 그들은 단지 일주 자바 과정을 필요로 할 때 어떤 회사는 삼주 스칼라 코스의 개발자를 보내는 정당화 할 수 없습니다.

  8. ==============================

    8.어떤 설명없이 간다 : 그 방법으로 주요 문제는 (CanBuildFrom [에 repr, B, 그] 암시 BF)이 있다고 생각합니다. 내가 아는 비록 암시 인수는이 통화에 미치는 영향을 나타내는 아무것도 무엇인가. scaladoc을 쫓는 만 좀 더 혼란 (심지어 문서를 CanBuildFrom 관련 클래스의 몇) 잎.

    어떤 설명없이 간다 : 그 방법으로 주요 문제는 (CanBuildFrom [에 repr, B, 그] 암시 BF)이 있다고 생각합니다. 내가 아는 비록 암시 인수는이 통화에 미치는 영향을 나타내는 아무것도 무엇인가. scaladoc을 쫓는 만 좀 더 혼란 (심지어 문서를 CanBuildFrom 관련 클래스의 몇) 잎.

    당신이 정말로 원하는 모든지도가 때 다소 도움이 될 것이다 "고 반환 형식으로 B 형의 객체의 빌더를 제공 BF위한 범위에서 내장 객체가 있어야한다"간단한을 생각하지만, 그것은 앞뒤를 헤아 리지 개념의 종류의 A는 B의에 있습니다. 사실, 나는 타입에 repr이 무엇을 의미하는지 알 수 없으며,에 이동에 대한 설명서가 확실히 전혀 단서를 제공하지 않기 때문에 즉, 맞아 확실하지 않다.

    그래서, 나는,도 즐거운 그 중 두 가지 옵션이 왼쪽 해요 :

    나는 스칼라는 기본적으로 이러한 일들이 작동하는 방법의 내장을 노출하고 그 궁극적으로이 기술 무엇 oxbow_lakes 할 수있는 방법을 제공하는 것을 얻을. 그러나 서명에 방해입니다.

  9. ==============================

    9.나는 스칼라 초보자 그리고 난 솔직히 그 유형 서명에 문제가 표시되지 않습니다. 매개 변수가 올바른 모음을 반환 빌더를지도하고 암시 적 매개 변수를 할 수있는 기능입니다. 명확하고 읽을.

    나는 스칼라 초보자 그리고 난 솔직히 그 유형 서명에 문제가 표시되지 않습니다. 매개 변수가 올바른 모음을 반환 빌더를지도하고 암시 적 매개 변수를 할 수있는 기능입니다. 명확하고 읽을.

    모든 것은 실제로 매우 우아한입니다. 빌더 유형 매개 변수는 암시 적 매개 변수 메커니즘이 클래스 사용자로부터이 추가 매개 변수를 숨 깁니다 동안 컴파일러가 올바른 리턴 유형을 선택할 수 있습니다. 나는이 시도 :

    Map(1 -> "a", 2 -> "b").map((t) => (t._2) -> (t._1)) // returns Map("a" -> 1, "b" -> 2)
    Map(1 -> "a", 2 -> "b").map((t) =>  t._2)            // returns List("a", "b")
    

    즉 바르게 다형성입니다.

    지금, 그것은, 주류 패러다임을 아니에요 부여가 떨어져 많은 놀라게됩니다. 그러나, 그것은 또한 표현력과 우아함의 가치를 많은 사람들을 끌 것이다.

  10. ==============================

    10.당신이 준지도에 대한 불행하게도 서명이지도에 대한 잘못된 일이고 정당한 비판은 참으로있다.

    당신이 준지도에 대한 불행하게도 서명이지도에 대한 잘못된 일이고 정당한 비판은 참으로있다.

    첫 번째 비판은지도에 대한 서명을 전복하여, 우리는 더 일반적인 무언가를 가지고있다. 기본적으로 미덕이라고 생각하는 일반적인 오류입니다. 그것은 아니다. > (X - -> Y) -> 기 조성물 및 ID의 두 법 준수와지도 기능을 매우 잘 공변 펑 FX는로 정의된다. "지도"에 의한 다른 건은 모조품입니다.

    주어진 서명은 뭔가 다른,하지만 매핑되지 않습니다. 내가 의심이 될하려고하면 종이, 반복자 패턴의 본질에서 "이송"서명의 전문 약간 변형 된 버전입니다. 여기의 서명은 다음과 같습니다

    traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
    

    나는 스칼라로 변환한다

    def traverse[A, B](f: A => F[B], a: T[A])(implicit t: Traversable[T], ap: Applicative[F]): F[T[B]
    

    물론 실패 - 그것은 충분히 일반적으로하지 않습니다! 또한, (당신이 신원 펑터를 통해 트래버스 실행하여지도를 얻을 수 있습니다) 약간 다릅니다. 그러나, 나는 도서관 작가가 잘 설명되어 있습니다 라이브러리 일반화 (효과와 실용적 프로그래밍이 상기 선행) 더 잘 인식한다면, 우리는이 오류를보고하지 않을 것이라고 생각한다.

    둘째,지도 기능 때문에를위한 지능형의 사용에서의 스칼라의 특별한 경우이다. 이것은 불행하게도 잘 갖추고 라이브러리 디자이너는 지능형의 문법 설탕을 희생하지 않고이 오류를 무시 할 수 없음을 의미합니다. 스칼라 라이브러리 디자이너는 방법을 파괴한다면 즉, 다음이 쉽게 무시하지만, 매핑되지 바랍니다입니다!

    나는 그대로 있기 때문에, 그것은 스칼라 분명히 내가 강한 반대를 이유로, 만들기에 주장 오류를 해결하기 어렵게 될 것이다, 누군가가 그것에 대해 최대 말하고 바랍니다. 즉 "(즉, 너무 열심히!) 평균 프로그래머의 무책임한 반대는"대신 포인터를 제공하고 도움이 더 나은 프로그래머가되기 위해 "쉽게 그들을 있도록 그들을 달래"되지하는 솔루션입니다. 나 자신과 스칼라의 목표는이 문제에 대한 경합에 있지만, 다시 점.

    당신은 아마에서 특정 응답 예측, 요점을하고 있었다 "평균 프로그래머." 즉, 주장 할 것이다 사람입니다 "하지만 너무 복잡하다!" 또는 일부 등. 이들은 당신이 참조하는 Yegges 또는 Blochs입니다. 반 지성 / 실용주의 운동이 사람들에 대한 나의 반응은 매우 가혹한 내가 이미 응답의 공세를 예상하고있어, 그래서 그것을 생략 할 것이다.

    나는 진정으로 스칼라 라이브러리가 개선 희망, 또는 적어도, 오류 안전하게 멀리 구석에 자리 잡고 할 수 있습니다. 자바는 "아무것도 유용을하려고"언어이다 오류의 압도적 인 양을 간단하게 피할 수 없기 때문에 종종 가치가 아니라고, 그래서 매우 비용이 많이 든다. 나는 같은 길을 가야하지 스칼라를 간청합니다.

  11. ==============================

    11.나는 완전히 질문 마틴의 대답 : 모두에 동의합니다. 심지어 자바, 제네릭과 자바 독을 읽는 인해 추가 소음 그것이 있어야보다 훨씬 어렵습니다. 이합니다 (implicits 매우 유용 컬렉션 모핑 물건을 할 때) 암시 적 매개 변수는 질문의 예제 코드로 사용되는 스칼라에서 혼합된다.

    나는 완전히 질문 마틴의 대답 : 모두에 동의합니다. 심지어 자바, 제네릭과 자바 독을 읽는 인해 추가 소음 그것이 있어야보다 훨씬 어렵습니다. 이합니다 (implicits 매우 유용 컬렉션 모핑 물건을 할 때) 암시 적 매개 변수는 질문의 예제 코드로 사용되는 스칼라에서 혼합된다.

    나는 그것 자체 언어에 문제가 있다고 생각하지 않는다 - 나는 그것의 더 금형 문제라고 생각한다. 내가 르그 W MITTAG의 말씀, 내가 scaladoc보고 (또는 IDE에서 유형의 문서) 생각에 동의하면서 그리고 - 그것은 소요 반환 무엇을하는 방법이 무엇인지 grok 수하기 위해 가능한 한 작은 뇌 전력으로 필요합니다. 그걸 얻기 위해 종이의 비트에 대수의 비트를 해킹 할 필요가 없어야합니다 :)

    확인 십오 (마틴의 예에서와 같이 모든 제네릭 그래서 그 좋은 grok 수 쉬운 인라인 할 수 있습니다) 어떤 변수 / 표현 / 유형에 대한 모든 방법을 보여줄 수있는 좋은 방법이 필요합니다. 나도 기본적으로 implicits을 숨기는 마틴의 아이디어를 좋아한다.

    scaladoc의 예를 촬영하려면 ...

    def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
    

    scaladoc이 볼 때 나는 기본적뿐만 아니라 암시 적 매개 변수 (사용자가 마우스로 작은 아이콘을 올려 놓으면 아마 그들이 보여)에 의해 숨길 수 [그건, B]는 일반 블록을하고 싶습니다 - 그 여분의 물건을 grok 수로서 일반적으로 그 관련하지 않은 그것을 읽고. 예를 들면 이처럼 보였다 경우 상상 ...

    def map(f: A => B): That
    

    좋은 명확하고 분명 그것은 무엇을. 당신은이 '고'예를 들어 강조 [B, 그] 텍스트를 확장 할 수 당신을 통해 마우스를 클릭 할 경우, 무엇을 '고'궁금 할 것이다.

    그것의 명확한 진술의 작은 비트가 붕괴되도록 어쩌면 작은 아이콘이 [] 선언 (암시 적 ...) 블록에 사용될 수? 하드 그것을 위해 토큰을 사용하는,하지만 난을 사용합니다. 지금은 ...

    def map.(f: A => B).: That
    

    , 메소드 이름의 매개 변수 유형과 좋은 간단한 간결한 방법으로 자사의 반환 유형을 - - 기본적으로 그래서 타입 시스템의 '소음'사람들이 볼 필요가 무엇의 주요 80 %에서 숨겨진 세부 사항에 약간의 확장 링크 당신은 정말 많이 걱정합니다.

    대부분의 사람들은 그들이 유형에 호출 할 수있는 방법과 그들이 전달할 수있는 매개 변수 찾아 scaladoc을 읽고있다. 우리는 좀 바로 어떻게 이럴 너무 많은 세부 사항을 사용자에게 과부하가 있습니다.

    여기에 또 다른 예입니다 ...

    def orElse[A1 <: A, B1 >: B](that: PartialFunction[A1, B1]): PartialFunction[A1, B1]
    

    우리가 제네릭 선언을 숨긴 경우 지금은 쉽게 읽기

    def orElse(that: PartialFunction[A1, B1]): PartialFunction[A1, B1]
    

    A. 공변 및 제네릭 contravariant 유형은 내가 생각하는 사용자에게 훨씬 쉽게 grok 수하는 방식으로도 표현 될 수있는 소음을 많이 추가 : 사람들이 위로 마우스를 가져간 경우, 말, A1 우리는 A1이 <인 A1의 선언을 보여줄 수 있습니다.

  12. ==============================

    12.나는 당신에게 그것을 휴식하는 방법을 모른다, 그러나 나는 캠브리지에서 박사 학위를 가지고 있고, 나는 잘 2.8을 사용하고 있습니다.

    나는 당신에게 그것을 휴식하는 방법을 모른다, 그러나 나는 캠브리지에서 박사 학위를 가지고 있고, 나는 잘 2.8을 사용하고 있습니다.

    더 심각하게, 나는 거의 그냥 이상 한 달 전에 스칼라를 사용하기 시작 (그것은 내가 사용하고 자바 라이브러리 간 영업하지 않습니다) 2.7과 모든 시간을 할애하지 않는다. 나는 하스켈 (별로)에 대한 어느 정도의 경험을 가지고 있지만, 당신이 걱정하고 (나는 생계를 위해 사용) 자바와 내 경험과 일치하는 방법을 찾았 물건을 무시했다.

    그래서 : 나는 "새로운 사용자"와 나는 연기되지 않았다 - 그것은 자바처럼 작동한다는 사실이 나에게 내가 이해하지 못했다 비트를 무시하기에 충분한 자신감을 주었다.

    (그러나, 나는 스칼라보고 된 이유는 직장에서 그것을 밀어 여부를 확인하기 위해 부분적으로, 그리고 나는 확실히 도움이 될 협박 문서 덜 만들기. 그래서 아직하지 않을거야,하지만 나를 놀라게하는 것은 여전히 ​​얼마나 많이 변경 및 개발되고있는 것은. 그래서 내가 무엇을 말하고있는 것은으로 그것을 얻기에 투입 나는 오히려 한정된 자원을 선호하는 거라고 추측 (대부분의 나를 놀라게 얼마나 굉장했지만, 변화는 두 번째 듯했으나, 무엇을 공정하게하기 위해) 최종 상태는 - 나는 그들이 곧이 인기를 기대하고 있었다 생각하지 않는다).

  13. ==============================

    13.전혀 스칼라을 몰라,하지만 몇 주 전에 내가 Clojure의를 읽을 수 없습니다. 지금은 그것의 대부분을 읽을 수 있지만 아직 가장 간단한 예제를 넘어 아무것도 쓸 수 없습니다. 나는 스칼라 다르지 않다 생각한다. 당신은 당신이 배울 방법에 따라 좋은 책이나 과정이 필요합니다. 그냥 위의지도 선언을 읽고, 나는 어쩌면 그것의 1/3을 얻었다.

    전혀 스칼라을 몰라,하지만 몇 주 전에 내가 Clojure의를 읽을 수 없습니다. 지금은 그것의 대부분을 읽을 수 있지만 아직 가장 간단한 예제를 넘어 아무것도 쓸 수 없습니다. 나는 스칼라 다르지 않다 생각한다. 당신은 당신이 배울 방법에 따라 좋은 책이나 과정이 필요합니다. 그냥 위의지도 선언을 읽고, 나는 어쩌면 그것의 1/3을 얻었다.

    나는 더 큰 문제는 이러한 언어의 구문없는 생각하지만, 채택 및 일상적인 생산 코드에서 사용할 수 있도록 패러다임을 내면화. 나를 위해 자바 등 파스칼에서 전혀 도약 아니었다 C,도 기본에서 큰 도약이 아니었다 C ++에서 큰 도약이 아니었다 ...하지만 Clojure에서 같은 기능의 언어로 코딩 (를위한 거대한 도약이다 나 어쨌든). 나는 스칼라는 자바 스타일이나 스칼라 스타일로 코딩 할 수 있습니다 같아요. 그러나 Clojure에 당신은 자바에서 필수적 습관을 유지하려고 아주 난장판을 만들 것입니다.

  14. ==============================

    14.스칼라는 매우 복잡하고 학술 보이지만, 사용하는 것을 쉽게하도록 설계되었습니다 (암시 적 매개 변수를 우려하고있다 특히) 미친 기능이 많이 있습니다. 가장 유용한 것들과 그들이 무엇을 잘 문서화 설명 (유형 A의 목적은 B 형의 객체에 대한 암시 적 변환을한다는 것을 의미한다 [A <%의 B]와 같은) 문법 설탕을 얻을. 하지만 대부분의 경우, 이러한 라이브러리의 클라이언트로 당신은 암시 적 매개 변수를 무시하고 옳은 일을하도록 신뢰할 수 있습니다.

    스칼라는 매우 복잡하고 학술 보이지만, 사용하는 것을 쉽게하도록 설계되었습니다 (암시 적 매개 변수를 우려하고있다 특히) 미친 기능이 많이 있습니다. 가장 유용한 것들과 그들이 무엇을 잘 문서화 설명 (유형 A의 목적은 B 형의 객체에 대한 암시 적 변환을한다는 것을 의미한다 [A <%의 B]와 같은) 문법 설탕을 얻을. 하지만 대부분의 경우, 이러한 라이브러리의 클라이언트로 당신은 암시 적 매개 변수를 무시하고 옳은 일을하도록 신뢰할 수 있습니다.

  15. ==============================

    15.나는 스칼라는 많은 힘을 가지고 있으며, 구문은 하스켈, OCaml로, SML, Lisps 같은 자바 / C ++ / PHP 프로그래머 외국 없습니다 때문 스칼라가 될 것입니다 얼마나 인기가 영향을주는 주요 요소라고 생각하지 않습니다 기타..

    나는 스칼라는 많은 힘을 가지고 있으며, 구문은 하스켈, OCaml로, SML, Lisps 같은 자바 / C ++ / PHP 프로그래머 외국 없습니다 때문 스칼라가 될 것입니다 얼마나 인기가 영향을주는 주요 요소라고 생각하지 않습니다 기타..

    그러나 나는 또한 다음 주류 언어가 훨씬 단순화해야한다 생각하고, 내가 얻을 볼 수있는 유일한 방법은 순수 불변성, 즉 선언적 HTML과 같은, 그러나 튜링 완전한 있기 때문에 스칼라의 인기가 자바 오늘날의 위치 이하로 고원 것입니다 생각하십니까 . 나는 그런 언어를 개발하고 있기 때문에, 나는 편견,하지만 난 단지 스칼라 내가 필요한 것을 위해 충분하지 수있는 몇 개월의 연구를 통해 배제 후 그렇게했다.

    나는 스칼라의 명성은 하스켈 단지 고통 것이라고 생각하지 않습니다. 하지만 일부는 대부분의 프로그래머를 들어, 내가 아직 스칼라를 사용하도록 강제 사용 사례를 참조하지 않기 때문에, 그것을 배우는 연기 할 것이다, 그들은 그것에 대해 학습을 지연하는 것이라고 생각. 아마도 확장 성이 뛰어난 서버 사이드는 가장 강력한 사용 사례입니다.

    그리고, 메인 스트림 시장에 먼저 학습 스칼라 하나는 처음 사용하는 HTML 또는 파이썬으로 즉시 프로그램을 작성한다,는 "신선한 공기의 호흡"아니다. 하나 하나 처음부터에 실수를 한단다 모든 세부 사항을 학습 한 후 스칼라, 당신에 성장하는 경향이있다. 그러나, 나는 처음부터 스칼라에서 프로그래밍을 읽은 아마, 내 경험과 학습 곡선의 의견은 달라졌을 것이다.

    명확히.

    나는 나의 새로운 언어의 초기 플랫폼으로 스칼라를 사용하고 있습니다. 나는 아마 내가 상업적으로 달리 스칼라를 사용하는 경우 스칼라의 수집 라이브러리에서 코드를 작성하지 않을 것입니다. 나는 보았다 한 번, 나는 스칼라의 수집 라이브러리에 비해 Scalaz의 유형 서명 더욱 자세한 다루기 힘든 발견 이후 나는 내 자신의 범주 이론을 기반으로 라이브러리를 만들 것입니다. 그 문제의 일부는 아마도 형 클래스를 구현하는 스칼라의 방법이며, 그것이 내가 내 자신의 언어를 만드는 오전 사소한 이유입니다.

    내가 연구하고 나는 나의 언어에 대한 일을하고있는 하나 스칼라의 컬렉션 클래스 디자인을 비교하는 자신을 강제로 싶었 기 때문에 나는이 대답을 쓰기로했다. 뿐만 아니라 내 생각 과정을 공유 할 수 있습니다.

    빌더 추상화의 2.8 스칼라 컬렉션의 사용은 사운드 디자인의 원칙이다. 나는 아래의 두 가지 디자인의 장단점을 탐구하고자합니다.

    또한 나는 내 마음에 스칼라의 트레이드 오프의 몇 가지 예를 하스켈 또는 내가 개발하고있는 언어와는 달리, 둘 모두 변경할 수 불변의 언어로 노력에 의한 것으로 불완전한 아이디어를 운반하고있다. 이 함축 약 토니 모리스의 의견에 동의한다. 내 언어에서, 더 루프없이 변경 가능한 구조가 없습니다. 내 언어는 (지금은) 스칼라의 위에 앉아서 그에게 많은 빚을지고, 그리고 스칼라는 일반 타입 시스템과 가변성을 가지고 있지 않은 경우이 불가능했을 것입니다. 내가 Odersky & 무어 내가 확인하기 때문에, 스칼라가 높은 종류의 유일한 OOP 언어입니다한다는 것은 올바르지 않습니다 ( "유형으로 비트 썩음 파이팅") (나 자신과를 통해 밥 하퍼)이 표준을 생각하기 때문에 즉,하지만 진실하지 않을 수 있습니다 ML 그들을있다. 또한 SML의 타입 시스템이 구 스칼라 자바 (및 C ++ / PHP)에 너무 유사하지 않기 때문에 용이하게 이해 될 수있다 (1980 년 이후) 동등하게 유연 할 수 나타난다. 어떤 경우에는,이 스칼라의 비판이 아니라 내가 질문에 밀접한 희망 트레이드 오프의 불완전한 분석을 제시하려는 시도가 아닙니다. 스칼라와 SML은 중요 다이아몬드 다중 상속을 할 하스켈의 무능력, 고생하지 않고 내가 하스켈 서곡에 너무 많은 기능이 다른 유형에 대해 반복하는 이유를 이해.

  16. ==============================

    16.여기 사람 정도를 명시하기 위해 필요한 것 : B.A.를 컴퓨터 과학 정치 과학 B.ed있다.

    여기 사람 정도를 명시하기 위해 필요한 것 : B.A.를 컴퓨터 과학 정치 과학 B.ed있다.

    지점 :

    그 기본 프로그래밍 패러다임이 어렵 기 때문에 스칼라는 어렵다. 함수 프로그래밍은 많은 사람들을 깜짝 놀라게한다. PHP에서 클로저를 구축하는 것이 가능하지만 사람들은 거의하지 않는다. 그들은 기본 패러다임의 힘 가치를 만들 수있는 구체적인 교육을하지 않은 경우 그래서 아니,이 서명하지만, 나머지는 모두, 사람을 연기하지 않습니다.

    이 교육을 사용할 수있는 경우, 모든 사람이 그것을 할 수 있습니다. 작년에 나는 SCALA 학교 아이들의 무리와 함께 체스 컴퓨터를 구축! 그들은 그들의 문제가 있었다 그러나 그들은 결국 잘했다.

    나는 걱정하지 않을 것입니다.

  17. ==============================

    17.나도 옥스포드에서 수학 학위를 가지고! 그것은 새로운 컬렉션 물건을 '얻을'걸 렸어요. 그러나 나는 지금 내가 할 것을 그것을 많이 좋아한다. 사실, '지도'의 입력은 (내가 한 첫 번째 일이 서브 클래스는 컬렉션 클래스 중 하나였다 아마도 때문에) 2.7에서 나를 도청 최초의 큰 일 중 하나였다.

    나도 옥스포드에서 수학 학위를 가지고! 그것은 새로운 컬렉션 물건을 '얻을'걸 렸어요. 그러나 나는 지금 내가 할 것을 그것을 많이 좋아한다. 사실, '지도'의 입력은 (내가 한 첫 번째 일이 서브 클래스는 컬렉션 클래스 중 하나였다 아마도 때문에) 2.7에서 나를 도청 최초의 큰 일 중 하나였다.

    새로운 2.8 컬렉션에 읽기 마틴의 논문은 정말 implicits의 사용을 설명하는 데 도움하지만, 예 문서 자체는 확실히 핵심 API를 메소드 서명에서 implicits의 다른 종류의 역할을 설명하는 더 나은 일을 할 필요가있다.

    때 2.8 것입니다 출시 될 : 내 주요 관심사는 더이 무엇입니까? 때 버그 리포트 그것을 위해 오는 중지 할 것인가? 스칼라 팀은 / 2.8 씹어 너무 한 번에 변경을 시도 할 수있는 것보다 오프 더 물린했다?

    정말 2.8 전혀 새로운 다른 작업을 추가하기 전에 우선 순위로 출시 안정을 참조, 그리고 것 경이 약간의 개선이 스칼라 컴파일러 개발 로드맵을 관리하는 방식으로 할 수 있다면 (무릎 부상으로 보면서).

  18. ==============================

    18.무슨 소용 사이트에서 오류 메시지에 대한?

    무슨 소용 사이트에서 오류 메시지에 대한?

    그리고 하나는 DSL에 맞는 사용자 지정 하나 기존의 유형을 통합하는 데 필요한 사용 사례 오는 경우에 대한 것. 하나는 잘 협회, 우선 순위, 암시 적 변환, 암시 적 매개 변수, 높은 종류, 어쩌면 실존 유형의 문제에 대한 교육을해야합니다.

    그것은 대부분은 간단합니다 알고 매우 좋은 그러나 그것은 반드시 충분하지 않습니다. 적어도 광범위한 라이브러리를 설계 할 경우이 물건을 알고있는 한 남자가 있어야합니다.

  19. from https://stackoverflow.com/questions/1722726/is-the-scala-2-8-collections-library-a-case-of-the-longest-suicide-note-in-hist by cc-by-sa and MIT license