복붙노트

[SCALA] 왜 제로 매개 변수 방법 이외에 스칼라 필요의 매개 변수가합니까?

SCALA

왜 제로 매개 변수 방법 이외에 스칼라 필요의 매개 변수가합니까?

나는 제로 매개 변수 및 매개 변수가 방법의 차이를 이해,하지만 난 정말 이해하지 못하는 것은 매개 변수가 방법이 필요하게하는 언어 디자인 선택이 될 것입니다.

내가 생각할 수있는 단점 :

현재는 모두 클래스에 정의 할 수 없습니다 : 당신이 방법은 이미 정의되어 말하는 오류가 발생합니다. 또한 그들은 Function0로 모두 변환합니다.

이유는 단지 방법 데프 foo는 수비력 foo는 () 정확히 같은 일을하고, 그들을 또는 괄호없이 호출을 허용하지? 그것이 얼마나의 그나은 무엇입니까?

해결법

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

    1.다니엘은 매개 변수가 방법이 필요한 이유를 설명에서 훌륭한 일을했다. 그들은 제로 매개 변수 방법에서 분명히 간주되는 이유를 설명 할 것이다.

    다니엘은 매개 변수가 방법이 필요한 이유를 설명에서 훌륭한 일을했다. 그들은 제로 매개 변수 방법에서 분명히 간주되는 이유를 설명 할 것이다.

    많은 사람들이 문법 설탕의 일부 모호한 형태로 매개 변수가 제로 매개 변수 기능의 차이를 볼 수 있습니다. 사실 그것은 (태닝이 무엇인지 완성도의보다 철저한 설명은 아래를 참조, 그리고 왜 같은 우리 모두 너무 많은) 순수 무두질 스칼라 지원하는 방법의 유물이다.

    공식적 함수는 0 개 이상의 파라미터를 각각 0 이상의 파라미터리스트를 가질 수있다. 이 방법은 다음 유효 : DEF A, B DEF ()뿐만 아니라, 인위적인 DEF C () 수비력 D (X : INT) () () (예 : INT) 등 ...

    함수 데프 푸 = ?? 제로 매개 변수 목록이 있습니다. 함수 DEF 바 () = ?? 정확하게 제로 매개 변수를 하나 개의 매개 변수 목록을 가지고 있습니다. 일관된 언어 기능으로 무두질 훼손했을 두 가지 형태 conflate 추가 규칙 소개 : 데프는 (DEF B에 상응하는 형태) 및 것이다 DEF C () 둘 다; DEF D (X : INT) () () (예 : INT) DEF E ()와 동등하게 (X : INT) (Y : INT) ().

    자바 상호 운용성을 처리 할 때 태닝는 무관 한 경우이다. 자바는 너무 () (직접 java.lang.String의 번호 길이 ()를 호출하는)도 "테스트"로 호출 될 "테스트".length 같은 제로 매개 변수 방법에 대한 문법 설탕을 도입 아무런 문제가 없다, 무두질 지원하지 않습니다. 길이.

    스칼라는 수학자 하스켈 카레의 이름을 딴 '태닝'라는 언어 기능을 지원합니다. 커링은 예컨대 여러 매개 변수 목록과 기능을 정의 할 수 있습니다 :

    def add(a: Int)(b: Int): Int = a + b
    add(2)(3) // 5
    

    지금 추가의 일부 응용 프로그램의 측면에서 INC 정의 할 수 있기 때문에 유용하다 :

    def inc: Int => Int = add(1)
    inc(2) // 3
    

    커링 가장 자주 예컨대 라이브러리를 통해 제어 구조를 도입하는 방법으로 볼 수있다 :

    def repeat(n: Int)(thunk: => Any): Unit = (1 to n) foreach { _ => thunk }
    
    repeat(2) {
      println("Hello, world")
    }
    
    // Hello, world
    // Hello, world
    

    반복 사용 태닝에 또 다른 기회를 열어 어떻게 정리 해보으로, 참조 :

    def twice: (=> Any) => Unit = repeat(2)
    
    twice {
      println("Hello, world")
    }
    
    // ... you get the picture :-)
    
  2. ==============================

    2.문제는 ML에 정기적으로 올라오고에 대한 하나의 좋은 점은주기적인 답이 있다는 것입니다.

    문제는 ML에 정기적으로 올라오고에 대한 하나의 좋은 점은주기적인 답이 있다는 것입니다.

    누가라는 스레드 저항 할 수있다 "우리 잘못은 무엇을?"

    https://groups.google.com/forum/#!topic/scala-debate/h2Rej7LlB2A

    스레드에서 펄프 픽션의 나의 마음에 드는 비트 :

    On Fri, Mar 2, 2012 at 10:15 AM, Rex Kerr <ich...@gmail.com> wrote:
    
    >This would leave you unable to distinguish between the two with 
    >structural types, but how often is the case when you desperately 
    >want to distinguish the two compared to the case where distinguishing 
    >between the two is a hassle?
    
    
    /** Note to maintenance programmer: It is important that this method be
     *  callable by classes which have a 'def foo(): Int' but not by classes which
     *  merely have a 'def foo: Int'.  The correctness of this application depends
     *  on maintaining this distinction.
     *  
     *  Additional note to maintenance programmer: I have moved to zambia.
     *  There is no forwarding address.  You will never find me.
     */
    def actOnFoo(...)
    

    그래서 기능에 대한 기본 동기는 ML 스레드의 종류를 생성하는 것입니다.

    googlology 중 하나 이상의 비트 :

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

    3.첫째, () => X와 => X 매개 변수가없는 방법과는 전혀 무관하다.

    첫째, () => X와 => X 매개 변수가없는 방법과는 전혀 무관하다.

    자, 이런 식으로 뭔가를 작성하는 꽤 바보 같다 :

    var x() = 5
    val y() = 2
    x() = x() + y()
    

    위의 매개 변수가 방법과 관련이있다 팔로우하지 않으면 지금, 당신은 균일 한 접근 원칙을 보일 것입니다. 위의 모든 방법을 선언하고, 그들 모두 고화질로 교체 할 수 있습니다. 당신은 자신의 괄호를 제거 가정되어있다.

  4. ==============================

    4.난 당신이 매개 변수가없는 방법으로 변경 가능한 상태를 액세스 할 수 있기 때문에 모두가 가능 말할 것입니다 :

    난 당신이 매개 변수가없는 방법으로 변경 가능한 상태를 액세스 할 수 있기 때문에 모두가 가능 말할 것입니다 :

    class X(private var x: Int) {
      def inc() { x += 1 }
      def value = x
    }
    

    있어서 값이 부작용이없는 (단지 가변 상태 액세스). 이 동작은 명시 적으로 스칼라 프로그래밍에서 언급 한 :

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

    5.(비 부작용에 비해 부작용) 언급 컨벤션 사실 외에, 그것은 몇 가지 경우에 도움이 :

    (비 부작용에 비해 부작용) 언급 컨벤션 사실 외에, 그것은 몇 가지 경우에 도움이 :

    빈 괄호를 갖는 유용성

    // short apply syntax
    
    object A {
      def apply() = 33
    }
    
    object B {
      def apply   = 33
    }
    
    A()   // works
    B()   // does not work
    
    // using in place of a curried function
    
    object C {
      def m()() = ()
    }
    
    val f: () => () => Unit = C.m
    

    노 괄호가없는의 유용성

    // val <=> def, var <=> two related defs
    
    trait T { def a:   Int; def a_=(v: Int): Unit }
    trait U { def a(): Int; def a_=(v: Int): Unit }
    
    def tt(t: T): Unit = t.a += 1  // works
    def tu(u: U): Unit = u.a += 1  // does not work
    
    // avoiding clutter with apply the other way round
    
    object D {
      def a   = Vector(1, 2, 3)
      def b() = Vector(1, 2, 3)
    }
    
    D.a(0)  // works
    D.b(0)  // does not work
    
    // object can stand for no-paren method
    
    trait E
    trait F { def f:   E }
    trait G { def f(): E }
    
    object H extends F {
      object f extends E  // works
    }
    
    object I extends G {
      object f extends E  // does not work
    }
    

    따라서 언어의 규칙의 측면에서, 그것은 (특히 마지막 표시된 경우에) 차이를 가지고 의미가 있습니다.

  6. from https://stackoverflow.com/questions/12334936/why-does-scala-need-parameterless-in-addition-to-zero-parameter-methods by cc-by-sa and MIT license