다음을 통해 공유


함수

함수는 인수 값 집합에서 단일 값으로의 매핑을 나타내는 값입니다. 함수는 입력 값 집합(인수 값)을 제공하여 호출되고 단일 출력 값(반환 값)을 생성합니다.

함수 작성

함수는 함수 식을 사용하여 작성됩니다.

function-expression:
      (parameter-listopt)function-return-typeopt=>function-body
function-body:
      식
parameter-list:
      fixed-parameter-list
      fixed-parameter-list
,optional-parameter-list
      optional-parameter-list
fixed-parameter-list:
      parameter
      parameter
,fixed-parameter-list
parameter:
      parameter-name parameter-typeopt
parameter-name:
      식별자
parameter-type:
      assertion
function-return-type:
      assertion
assertion:

      asnullable-primiitve-type
optional-parameter-list:
      optional-parameter
      optional-parameter
,optional-parameter-list
optional-parameter:

      optionalparameter
nullable-primitve-type
      nullable
optprimitive-type

다음은 정확히 두 개의 값이 필요하고 y해당 값 x 에 연산자를 적용한 + 결과를 생성하는 함수의 예입니다. 함수의 x 매개 변수 목록일부이며 x + y 함수 본문인 매개 변수입니다.y

(x, y) => x + y

함수 식을 계산한 결과는 함수-본문을 계산하지 않고 함수 값을 생성하는 것입니다. 이 문서의 규칙으로 함수 값(함수 식과 반대)은 매개 변수 목록과 함께 표시되지만 함수 본문 대신 줄임표(...)가 표시됩니다. 예를 들어 위의 함수 식이 평가되면 다음 함수 값으로 표시됩니다.

 (x, y) => ...

다음 연산자는 함수 값에 대해 정의됩니다.

연산자 결과
x = y 같음
x <> y 같지 않음

함수 값의 네이티브 형식은 매개 변수 이름을 나열하고 모든 매개 변수 형식과 반환 any형식을 지정하는 사용자 지정 함수 형식(내장 형식function에서 파생됨)입니다. (이동 함수 형식 에 대한 세부 정보를 위한 함수 형식입니다.)

함수 호출

함수의 함수 본문은 invoke 식을 사용하여 함수 값을 호출하여 실행됩니다. 함수 값을 호출하면 함수 값의 함수 본문 이 평가되고 값이 반환되거나 오류가 발생합니다.

invoke-expression:
      primary-expression
(argument-listopt)
argument-list:
      expression-list

함수 값이 호출될 때마다 값 집합은 함수에 대한 인수라고 하는 인수 목록으로 지정됩니다.

인수 목록은 고정된 수의 인수를 식 목록으로 직접 지정하는 데 사용됩니다. 다음 예제에서는 필드에 함수 값이 있는 레코드를 정의한 다음 레코드의 다른 필드에서 함수를 호출합니다.

[ 
    MyFunction = (x, y, z) => x + y + z, 
    Result1 = MyFunction(1, 2, 3)           // 6
]

함수를 호출할 때 다음이 유지합니다.

  • 함수의 함수 본문을 평가하는 데 사용되는 환경에는 매개 변수와 이름이 같은 각 매개 변수에 해당하는 변수가 포함됩니다. 각 매개 변수의 값은 매개 변수에 정의된 대로 invoke 식인수 목록에서 생성된 값에 해당합니다.

  • 함수-본문이 평가되기 전에 함수 인수에 해당하는 모든 식이 평가됩니다.

  • 식 목록 또는 함수 본문식을 평가할 때 발생하는 오류가 전파됩니다.

  • 인수 목록에서 생성된 인수 수는 함수의 매개 변수와 호환되어야 합니다. 그렇지 않으면 이유 코드"Expression.Error"와 함께 오류가 발생합니다. 호환성을 결정하는 프로세스는 매개 변수에 정의되어 있습니다.

매개 변수

매개 변수 목록에는 다음과 같은 두 가지 종류의 매개 변수가 있을 수 있습니다.

  • 필수 매개 변수는 함수가 호출될 때 매개 변수에 해당하는 인수를 항상 지정해야 임을 나타냅니다. 매개 변수 목록에서 먼저 필수 매개 변수를 지정해야 합니다. 다음 예제의 함수는 필수 매개 변수 x 를 정의하고 y다음을 수행합니다.

      [ 
          MyFunction = (x, y) => x + y, 
    
          Result1 = MyFunction(1, 1),     // 2 
          Result2 = MyFunction(2, 2)      // 4
      ] 
    
  • 선택적 매개 변수는 함수가 호출될 때 매개 변수에 해당하는 인수를 지정할 수 있지만 지정할 필요는 없음을 나타냅니다. 함수가 호출될 때 선택적 매개 변수에 해당하는 인수를 지정하지 않으면 값 null 이 대신 사용됩니다. 선택적 매개 변수는 매개 변수 목록필수 매개 변수 앞에 나타나야 합니다. 다음 예제의 함수는 고정 매개 변수와 선택적 매개 x 변수 y를 정의합니다.

      [ 
          MyFunction = (x, optional y) =>
                            if (y = null) x else x + y, 
          Result1 = MyFunction(1),        // 1 
          Result2 = MyFunction(1, null),  // 1 
          Result3 = MyFunction(2, 2),     // 4
      ] 
    

함수가 호출될 때 지정된 인수의 수는 매개 변수 목록과 호환되어야 합니다. 함수 F 에 대한 인수 A 집합의 호환성은 다음과 같이 계산됩니다.

  • N이 인수 목록에서 생성된 인수 A 수를 나타내도록 합니다. 예시:

      MyFunction()             // N = 0 
      MyFunction(1)            // N = 1 
      MyFunction(null)         // N = 1 
      MyFunction(null, 2)      // N = 2 
      MyFunction(1, 2, 3)      // N = 3 
      MyFunction(1, 2, null)   // N = 3 
      MyFunction(1, 2, {3, 4}) // N = 3
    
  • 필요한이 고정 매개 변수의 F 수를 나타내고 선택적으로 의 선택적 매개 변수 F수를 나타내도록 합니다. 예시:

    ()               // Required = 0, Optional = 0 
    (x)              // Required = 1, Optional = 0 
    (optional x)     // Required = 0, Optional = 1 
    (x, optional y)  // Required = 1, Optional = 1
    
  • A 인수는 다음이 true인 경우 함수 F 와 호환됩니다.

    • (N >= 고정) 및 (N <= (고정 + 선택적))
    • 인수 형식은 '의 해당 매개 변수 형식과 F호환됩니다.
  • 함수에 선언된 반환 형식이 있는 경우 함수 본문의 F 결과 값은 다음이 true이면 '의 반환 형식과 F호환됩니다.

    • 함수 매개 변수에 대해 제공된 인수를 사용하여 함수 본문을 평가하여 생성되는 값에는 반환 형식과 호환되는 형식이 있습니다.
  • 함수 본문이 함수의 반환 형식과 호환되지 않는 값을 생성하면 이유 코드 "Expression.Error" 에 오류가 발생합니다.

재귀 함수

재귀 함수 값을 작성하려면 범위 지정 연산자(@)를 사용하여 범위 내에서 함수를 참조해야 합니다. 예를 들어 다음 레코드에는 함수를 정의하는 필드와 함수를 Factorial 호출하는 다른 필드가 포함됩니다.

[ 
    Factorial = (x) => 
                if x = 0 then 1 else x * @Factorial(x - 1), 
    Result = Factorial(3)  // 6 
]

마찬가지로 액세스해야 하는 각 함수에 이름이 있는 한 상호 재귀 함수를 작성할 수 있습니다. 다음 예제에서는 함수의 Factorial 일부가 두 번째 Factorial2 함수로 리팩터링되었습니다.

[ 
    Factorial = (x) => if x = 0 then 1 else Factorial2(x), 
    Factorial2 = (x) => x * Factorial(x - 1), 
    Result = Factorial(3)     // 6 
]

폐쇄

함수는 다른 함수를 값으로 반환할 수 있습니다. 이 함수는 원래 함수에 대한 하나 이상의 매개 변수에 따라 달라질 수 있습니다. 다음 예제에서 필드 MyFunction 와 연결된 함수는 지정된 매개 변수를 반환하는 함수를 반환합니다.

[ 
    MyFunction = (x) => () => x, 
    MyFunction1 = MyFunction(1), 
    MyFunction2 = MyFunction(2), 
    Result = MyFunction1() + MyFunction2()  // 3 
]

함수가 호출될 때마다 매개 변수 값을 기본 호출할 때 매개 변수 값이 반환되도록 하는 새 함수 값이 반환됩니다.

함수 및 환경

매개 변수 외에도 함수 식의 함수 본문은 함수가 초기화될 때 환경에 있는 변수를 참조할 수 있습니다. 예를 들어 필드에 MyFunction 정의된 함수는 바깥쪽 레코드A의 필드에 C 액세스합니다.

[ 
A =  
    [ 
        MyFunction = () => C, 
        C = 1 
    ], 
B = A[MyFunction]()           // 1 
]

MyFunction 호출되면 변수C가 포함되지 않은 환경(B)에서 호출되더라도 변수C의 값에 액세스합니다.

간소화된 선언

각 식은 명명 _ 된 단일 매개 변수(밑줄)를 사용하여 형식화되지 않은 함수를 선언하기 위한 구문 약식입니다.

각 식:
      eacheach-expression-body
each-expression-body:
      function-body

간소화된 선언은 일반적으로 상위 함수 호출의 가독성을 향상시키는 데 사용됩니다.

예를 들어 다음 선언 쌍은 의미상 동일합니다.

each _ + 1 
(_) => _ + 1  
each [A] 
(_) => _[A] 
 
Table.SelectRows( aTable, each [Weight] > 12 ) 
Table.SelectRows( aTable, (_) => _[Weight] > 12 )