복붙노트

[SCALA] 때 스칼라 중위 표기법에 괄호를 사용하는

SCALA

때 스칼라 중위 표기법에 괄호를 사용하는

스칼라에서 프로그래밍 할 때, 나는 점점 더 많은 기능 물건을한다. 중위 표기법을 사용하는 경우 그러나, 당신이 괄호를 필요로하고 당신이하지 않을 때 때 얘기하기 어렵다.

예를 들어 다음 코드 조각의 경우 :

def caesar(k:Int)(c:Char) = c match {
    case c if c isLower => ('a'+((c-'a'+k)%26)).toChar
    case c if c isUpper => ('A'+((c-'A'+k)%26)).toChar
    case _ => c
}

def encrypt(file:String,k:Int) = (fromFile(file) mkString) map caesar(k)_

(FROMFILE (파일) 된 mkString)를 컴파일하기 위해 괄호가 필요합니다. 제거되면 나는 다음과 같은 오류가 발생합니다 :

Caesar.scala:24: error: not found: value map
    def encrypt(file:String,k:Int) = fromFile(file) mkString map caesar(k)_
                                                                 ^
one error found

분명히 된 mkString 것은 내가지도 기능을 사용할 수 있습니다 (암시 적 변환 AFAIK에 의해)하는 문자열을 반환합니다.

왜 이런 특별한 경우 괄호를 필요로 하는가? 당신이 그것을 필요로 할 때 그 이유에 대한 일반적인 지침이 있습니까?

해결법

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

    1.이것은 내가 사양을 읽은 후 자신을 위해 함께 넣어 것입니다 :

    이것은 내가 사양을 읽은 후 자신을 위해 함께 넣어 것입니다 :

    예를 A에 대해. ## (B)는 ##의 B와를 기록 할 수 있습니다.! 을 쓸 수 있습니다!

    그것이 FROMFILE (파일)의 중위 opertor 된 mkString지도 시저 (K) _로 알 수있는 하나의 매개 변수를 사용 된 mkString 버전이 때문에. A와 후위 연산자를 사용할 수있는 파라미터를 취하지 않는다 된 mkString 버전이있다 :

    scala> List(1,2) mkString
    res1: String = 12
    
    scala> List(1,2) mkString "a"
    res2: String = 1a2
    

    언젠가 올바른 위치에 점을 추가, 당신은, 예를 들어, 필요한 우선 순위를 얻을 수 있습니다 FROMFILE (파일) .mkString지도 {}

    그리고 모든 우선 순위 것은리스트 된 mkString지도 기능이 list.mkString (지도) .function,이 그것이 구문 분석하는 방법입니다 말이 안 순간에도, 입력하고 다른 단계 전에 발생합니다.

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

    2.스칼라 참조 (6.12.3 : 작업 X 전 Fi를 X에서 과학 X, 및 포스트 파이를) 언급

    스칼라 참조 (6.12.3 : 작업 X 전 Fi를 X에서 과학 X, 및 포스트 파이를) 언급

    당신이 (주위에 괄호 'FROMFILE (파일) 된 mkString'로) 그룹화해야합니다 귀하의 경우, '지도', '된 mkString'운영자에 대한 용어는 아니다

    사실, 매트 R은 논평 :

    (upvoted) huynhjl의 대답은 더 자세한 정보를 제공하고, (또한 upvoted) 마크 부시 대통령의 대답은 "스칼라의 투어 : 운영자는"가리 "하나의 매개 변수를 받아 처리하는 방법은 중위 연산자로 사용할 수있다"고 설명 할 수 있습니다.

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

    3.다음은 간단한 규칙이다 : 후위 연산자를 사용하지 마십시오. 당신이 할 경우, 괄호 안에 후위 연산자로 끝나는 전체 표현식을 넣어.

    다음은 간단한 규칙이다 : 후위 연산자를 사용하지 마십시오. 당신이 할 경우, 괄호 안에 후위 연산자로 끝나는 전체 표현식을 넣어.

    실제로, 기본적으로 경고를 생성합니다 그렇게 스칼라 2.10.0로 시작.

    좋은 측정의 경우, 후위 연산자를 이동하고 그것을 위해 점 표기법을 사용할 수 있습니다. 예를 들면 :

    (fromFile(file)).mkString map caesar(k)_
    

    또는, 더 간단하게,

    fromFile(file).mkString map caesar(k)_
    

    반면에, 당신이 중위로를 설정하는 빈 괄호를 제공 할 수있는 방법에주의 :

    fromFile(file) mkString () map caesar(k)_
    
  4. ==============================

    4.사양은 취소하지 않습니다,하지만 내 경험과 실험은 스칼라 컴파일러는 항상 중위 연산자로 중위 표기법을 사용하여 치료 방법 통화를 시도 할 것이라는 점을 보여 주었다. 된 mkString의 사용이 접미사가 있지만, 컴파일러는 중위로 해석하려고 시도 등 인수로서 "지도"를 해석하기 위해 노력하고있다. 후위 연산자의 모든 용도 중 하나를 즉시 식 종결 따라야합니다 또는 컴파일러 등을 볼 수 있도록 "점"표기법을 사용할 수.

    사양은 취소하지 않습니다,하지만 내 경험과 실험은 스칼라 컴파일러는 항상 중위 연산자로 중위 표기법을 사용하여 치료 방법 통화를 시도 할 것이라는 점을 보여 주었다. 된 mkString의 사용이 접미사가 있지만, 컴파일러는 중위로 해석하려고 시도 등 인수로서 "지도"를 해석하기 위해 노력하고있다. 후위 연산자의 모든 용도 중 하나를 즉시 식 종결 따라야합니다 또는 컴파일러 등을 볼 수 있도록 "점"표기법을 사용할 수.

    스칼라의 투어에 (이 철자가 아니에요 있지만)이의 힌트를 얻을 수 있습니다 : 연산자.

  5. from https://stackoverflow.com/questions/5592642/when-to-use-parenthesis-in-scala-infix-notation by cc-by-sa and MIT license