F #-함수
F #에서 함수는 데이터 형식처럼 작동합니다. 다른 변수와 같은 방식으로 함수를 선언하고 사용할 수 있습니다.
함수는 다른 변수처럼 사용할 수 있으므로 다음을 수행 할 수 있습니다.
- 이름이있는 함수를 만들고 해당 이름을 유형과 연결합니다.
- 값을 지정하십시오.
- 그 값에 대해 몇 가지 계산을 수행하십시오.
- 다른 함수 나 서브 루틴에 매개 변수로 전달하십시오.
- 다른 함수의 결과로 함수를 반환합니다.
함수 정의
함수는 다음을 사용하여 정의됩니다. let예어. 함수 정의에는 다음과 같은 구문이 있습니다.
let [inline] function-name parameter-list [ : return-type ]
= function-body
어디,
function-name 함수를 나타내는 식별자입니다.
parameter-list공백으로 구분 된 매개 변수 목록을 제공합니다. 또한 각 매개 변수에 대해 명시 적 유형을 지정할 수 있으며 지정되지 않은 경우 컴파일러는 변수와 같이 함수 본문에서이를 추론하는 경향이 있습니다.
function-body식 또는 여러 식으로 구성된 복합 식으로 구성됩니다. 함수 본문의 마지막 표현식은 반환 값입니다.
return-type유형이 뒤에 오는 콜론이며 선택 사항입니다. 반환 유형이 지정되지 않은 경우 컴파일러는 함수 본문의 최종 표현식에서이를 결정합니다.
함수의 매개 변수
함수 이름 바로 뒤에 매개 변수 이름을 나열합니다. 매개 변수 유형을 지정할 수 있습니다. 매개 변수 유형은 콜론으로 구분 된 매개 변수 이름 뒤에 와야합니다.
매개 변수 유형이 지정되지 않으면 컴파일러에서 유추됩니다.
예를 들면-
let doubleIt (x : int) = 2 * x
함수 호출
함수 이름 뒤에 공백과 공백으로 구분 된 인수를 지정하여 함수를 호출합니다.
예를 들면-
let vol = cylinderVolume 3.0 5.0
다음 프로그램은 개념을 설명합니다.
예 1
다음 프로그램은 반지름과 길이가 매개 변수로 주어 졌을 때 실린더의 부피를 계산합니다.
// the function calculates the volume of
// a cylinder with radius and length as parameters
let cylinderVolume radius length : float =
// function body
let pi = 3.14159
length * pi * radius * radius
let vol = cylinderVolume 3.0 5.0
printfn " Volume: %g " vol
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
Volume: 141.372
예 2
다음 프로그램은 주어진 두 매개 변수의 더 큰 값을 반환합니다.
// the function returns the larger value between two
// arguments
let max num1 num2 : int32 =
// function body
if(num1>num2)then
num1
else
num2
let res = max 39 52
printfn " Max Value: %d " res
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
Max Value: 52
예제 3
let doubleIt (x : int) = 2 * x
printfn "Double 19: %d" ( doubleIt(19))
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
Double 19: 38
재귀 함수
재귀 함수는 자신을 호출하는 함수입니다.
다음을 사용하여 재귀를 정의합니다. let rec 키워드 조합.
재귀 함수를 정의하는 구문은 다음과 같습니다.
//Recursive function definition
let rec function-name parameter-list = recursive-function-body
예를 들면-
let rec fib n = if n < 2 then 1 else fib (n - 1) + fib (n - 2)
예 1
다음 프로그램은 피보나치 1 ~ 10을 반환합니다.
let rec fib n = if n < 2 then 1 else fib (n - 1) + fib (n - 2)
for i = 1 to 10 do
printfn "Fibonacci %d: %d" i (fib i)
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
Fibonacci 1: 1
Fibonacci 2: 2
Fibonacci 3: 3
Fibonacci 4: 5
Fibonacci 5: 8
Fibonacci 6: 13
Fibonacci 7: 21
Fibonacci 8: 34
Fibonacci 9: 55
Fibonacci 10: 89
예 2
다음 프로그램은 계승 8을 반환합니다-
open System
let rec fact x =
if x < 1 then 1
else x * fact (x - 1)
Console.WriteLine(fact 8)
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
40320
F #의 화살표 표기법
F #은 연결된 화살표 표기법을 사용하여 함수 및 값의 데이터 형식에 대해보고합니다. 하나의 int 입력을 받고 문자열을 반환하는 함수의 예를 살펴 보겠습니다 . 화살표 표기법에서는-
int -> string
데이터 유형은 왼쪽에서 오른쪽으로 읽습니다.
두 개의 int 데이터 입력을 받아 문자열을 반환하는 또 다른 가상 함수를 살펴 보겠습니다.
let mydivfunction x y = (x / y).ToString();;
F #은 연결 화살표 표기법을 사용하여 데이터 유형을 다음과 같이보고합니다.
val mydivfunction : x:int -> y:int -> string
반환 유형은 연결된 화살표 표기법의 맨 오른쪽 데이터 유형으로 표시됩니다.
더 많은 예-
표기법 | 의미 |
---|---|
플로트 → 플로트 → 플로트 | 이 함수는 두 개의 float 입력을 받고 다른 float를 반환합니다 . |
int → 문자열 → float | 이 함수는 int 및 문자열 입력을 받아 float를 반환합니다 . |
람다 식
ㅏ lambda expression 이름이 지정되지 않은 함수입니다.
두 가지 기능의 예를 들어 보겠습니다.
let applyFunction ( f: int -> int -> int) x y = f x y
let mul x y = x * y
let res = applyFunction mul 5 7
printfn "%d" res
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
35
이제 위의 예에서 mul 함수를 정의하는 대신 람다 식을 다음과 같이 사용할 수 있습니다.
let applyFunction ( f: int -> int -> int) x y = f x y
let res = applyFunction (fun x y -> x * y ) 5 7
printfn "%d" res
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
35
기능 구성 및 파이프 라이닝
F #에서는 하나의 함수를 다른 함수로 구성 할 수 있습니다.
다음 예제는 두 함수 function1과 function2에서 f라는 함수의 구성을 보여줍니다.
let function1 x = x + 1
let function2 x = x * 5
let f = function1 >> function2
let res = f 10
printfn "%d" res
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
55
F #은 또한 pipelining of functions. 파이프 라이닝을 사용하면 함수 호출을 연속 작업으로 함께 연결할 수 있습니다.
다음 예는-
let function1 x = x + 1
let function2 x = x * 5
let res = 10 |> function1 |> function2
printfn "%d" res
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
55