복붙노트

[SCALA] 스칼라에서 마우스 오른쪽 연관 방법이 무슨 소용인가?

SCALA

스칼라에서 마우스 오른쪽 연관 방법이 무슨 소용인가?

난 그냥 스칼라와 장난 시작했습니다, 난 그냥 (필수 객체 지향 언어에서 일반적인 전통적인 왼쪽 연관성에 반대되는) 방법은 마우스 오른쪽 결합을 할 수있는 방법에 대해 배웠습니다.

내가 죄수에 스칼라의 목록을 예제 코드를보고 처음에, 나는 모든 예제는 항상 오른쪽에있는 목록을 한 것으로 나타났습니다했다 :

println(1 :: List(2, 3, 4))
newList = 42 :: originalList

나는 (당시)을 몰라 그러나, 또 다시이를보고 난 후에, 나는 그 :: 목록에 방법입니다, 그것에 대해 두 번 생각하지 않았다. 난 그냥 (자바의 연산자의 의미에서 다시) 운영자이었다 가정하고 그 연관성은 중요하지 않았다. 목록은 항상 예제 코드의 오른쪽에 나타났다는 사실은 단지 (나는 그것이 어쩌면 단지 '선호하는 스타일 "이라고 생각) 우연 보였다.

지금은 더 잘 알고 : 그것은 바로 연관 ::이기 때문에 그런 식으로 작성해야합니다.

내 질문은 오른쪽 결합 방법을 정의 할 수있는 점은 무엇입니까?

그것은 심미적 인 이유로 순전히하거나 마우스 오른쪽 연관성은 실제로 특정 상황에서 왼쪽 연관성을 통해 이익의 어떤 종류를 가질 수있다?

내 (초보자)에서 포인트 -보기, 정말 표시되지 않습니다

1 :: myList

보다 낫다

myList :: 1

하지만 나는 그것이 공정한 비교 의심 이러한 사소한 예를 분명히합니다.

해결법

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

    1.짧은 대답은 오른쪽 연관성이 어떤 프로그램이 실제로 무엇과 일치 프로그래머 유형함으로써 가독성을 향상시킬 수 있다는 것입니다. 입력한다면, '1 : 2 : 3', 당신은 목록을 얻을 수 (1, 2, 3) 다시, 대신 완전히 다른 순서로 다시 목록을 가져 오는. '1 : 2 : 3 : 무기 호'는 사실 때문이 것

    짧은 대답은 오른쪽 연관성이 어떤 프로그램이 실제로 무엇과 일치 프로그래머 유형함으로써 가독성을 향상시킬 수 있다는 것입니다. 입력한다면, '1 : 2 : 3', 당신은 목록을 얻을 수 (1, 2, 3) 다시, 대신 완전히 다른 순서로 다시 목록을 가져 오는. '1 : 2 : 3 : 무기 호'는 사실 때문이 것

    List[Int].3.prepend(2).prepend(1)
    
    scala> 1 :: 2 :: 3:: Nil
    res0: List[Int] = List(1, 2, 3)
    

    이는 둘 다 :

    (알림, 스칼라의 책 프로그래밍에서 발췌) 방법은 오퍼레이터 표기를 사용하는 경우, 예컨대 A * B를 같은 방법은 같이 왼쪽 피연산자 불려 * (b) -. 메소드 이름 콜론 만료하지 않으면. 메소드 이름은 콜론으로 끝나는 경우, 방법은 오른쪽 피연산자에 호출됩니다. ) twoThree.::(1 : 따라서, 1 : twoThree에서 :: 방법은 다음과 같이 일을 전달 twoThree에 호출됩니다.

    목록의 경우,이 추가 작업의 역할을한다 (목록은 실제로는 목록에 앞에 추가되는 1이고, '1 2 3'형성 '1'이후에 추가 될 것으로 보인다). ::로 붙이는 것은 일정 시간이 걸리는 반면,이 목록에 추가하는 데 걸리는 시간이 목록의 크기에 따라 선형 적으로 증가하기 때문에 클래스 목록, 진정한 추가 작업을 제공하지 않습니다. myList에 :: 1 ( '1 : myList에'같이)으로 myList에 1을 붙이는 것보다 더 길 것이다, '1'으로 myList의 전체 내용을 앞에 추가하려고 할 것이다

    참고 : 상관없이, 그러나, 피연산자는 연산자입니다했다 연관성 무엇 항상 왼쪽에서 오른쪽으로 평가했다. 따라서, B는 다음 ::: B는보다 정확하게 다음 블록으로 취급 불변 값으로 단순한 참조하지 않은 표현 인 경우 :

    { val x = a; b.:::(x) }
    

    이 블록 (A)에서 정지 한 후,이 평가 결과를 (B)으로 평가하고, :::의 방법 내지 b 피연산자로 전달된다.

    즉 보통의 왼쪽 결합 작업 ( '1 : myList에') 실제로 잘 표현 때문에에 작업을 적용하는 동안의 모양을 유지할 수 있습니다;

    당신이 말하는 그래서 "문법적"내가 아는 한. 참고 foldLeft의 경우, 예를 들어, 그들은합니다 ( '/'와 바로 연관 연산자에 해당)까지로 조금 갈 수

    귀하의 의견의 일부를 포함하려면 약간 고쳐 :

    당신은 'APPEND'기능을 고려하는 경우, 왼쪽 연관, 당신은 쓰기 'oneTwo 3 APPEND 4 APPEND 5를 추가'것입니다. 그것은 (당신이 표기되는 방식으로 가정 할 것이다) oneTwo 3, 4, 5를 추가한다면 그러나, 그것은 O (N) 일 것이다. 그것을 위해 인 경우와 같은 '::' "추가". 그러나 그것은 아니다. 그것은 "앞에 추가"를 실제로

    그 수단 '는 B ::의 :: 닐은'입니다 '에서 []. b.prepend (a)'

    왼쪽 연관을 붙일 아직 남아 있다면 '::'다음 결과 목록이 잘못된 순서에있을 것입니다. 당신은 (5 1, 2, 3, 4)하지만 (2, 5, 4, 3, 1), 어떤 프로그래머가 예기치 않게 수 있습니다 목록을 반환 끝날 것 목록을 반환 할 것으로 예상합니다. 무슨 짓을 한거야 왼쪽 연관 위해이었을 것, 때문이다 :

    (1,2).prepend(3).prepend(4).prepend(5) : (5,4,3,1,2)
    

    그래서, 오른쪽 연관성은 반환 값의 실제 순서와 코드 일치를 위로한다.

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

    2.나는 오른쪽 결합 방법의 포인트는 다른 사람에게 일반적으로 운영자 최우선의 포인트입니다 언어를 확장 할 수있는 기회를 제공하는 것입니다 생각합니다.

    나는 오른쪽 결합 방법의 포인트는 다른 사람에게 일반적으로 운영자 최우선의 포인트입니다 언어를 확장 할 수있는 기회를 제공하는 것입니다 생각합니다.

    연산자 오버로딩 유용한 것, 그래서 스칼라는 말했다 : 왜 문자의 조합으로 열지? 오히려, 왜 사업자 및 방법 사이의 구별을? 자, 어떻게 라이브러리 구현은 지능과 같은 내장 유형과 상호 작용합니까? C ++, 그녀는 전역 범위에서 친구 기능을 사용하는 것입니다. 우리는 모든 종류의 연산자를 구현하려는 경우 :?

    오른쪽 연관성은 추가 할 수있는 깨끗한 방법을 제공합니다 :: 연산자를 모든 종류의. 물론, 기술적으로 :: 연산자는리스트 형식의 방법이다. 그러나 그것은 또한 내장에 대한 지능과 다른 유형의 모든, 당신이 마지막에 :: 무기 호를 무시할 수 이상의 경우 메이크업 생각 운영자입니다.

    나는 그들을 지원하는 유연한 언어를 도서관에서 많은 일을 구현하고 만드는 스칼라의 철학을 반영하고 생각합니다. 이 사람이로 호출 할 수 SuperList, 가지고 올 수있는 기회를 수 있습니다 :

    1 :: 2 :: SuperNil
    

    그것은 바로 연관성는 현재 끝에 콜론에 하드 코딩되어 다소 불행한 일이지만, 나는 그것을 기억하기 쉽게 충분하게 생각한다.

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

    3.마우스 오른쪽 연관성과 왼쪽 연관성은 목록 배의 작업을 수행하는 중요한 역할을한다. 예를 들어 :

    마우스 오른쪽 연관성과 왼쪽 연관성은 목록 배의 작업을 수행하는 중요한 역할을한다. 예를 들어 :

    def concat[T](xs: List[T], ys: List[T]): List[T] = (xs foldRight ys)(_::_)
    

    이것은 완벽하게 잘 작동합니다. 하지만 당신은 같은 사용 foldLeft의 작업을 수행 할 수 없습니다

    def concat[T](xs: List[T], ys: List[T]): List[T] = (xs foldLeft ys)(_::_)
    

    때문에이 :: 마우스 오른쪽 연관입니다.

  4. from https://stackoverflow.com/questions/1162924/what-good-are-right-associative-methods-in-scala by cc-by-sa and MIT license