[Ocaml] 함수표현, Currying, if then else, recursive, in
Ocaml
* Procedure Definitions
- let <variable> = <expr> (let binding)
# let x = 0;;
val x : int = 0
# let s = "string";;
val s : string = "string"
# let b = true;;
val b : bool = true
# let x = 1+3;; *x에 식을 지정할 수 있다
val x : int = 4
# let add = (+);; *add에 +기능을 넣었다
val add : int -> int -> int = <fun> *int값 사용 제시
# add x 5;; *add x and 5
- : int = 9
# let mul = ( * );; *곱셈은 띄어쓰기 필수!
# mul (add 1 (mul 2 3)) (add 4 5);; *띄어쓰기 잘 하기
- : int = 63
- let <name> <formal parameters> = <body> (Procedure definition)
# let square x = x * x;;
val square : int -> int = <fun>
- <operator‐expr> <operand‐expr> (Procedure application)
# square 2;;
- : int = 4
- fun <formal parameters> ‐> <body> (Anonymous function definition)
# fun x -> x * x;;
- : int -> int = <fun>
# let square = fun x -> x * x;;
val square : int -> int = <fun>
* Currying
Multi‐parameter function -> nested single parameter functions (여러 인수를 받아 하나로)
# let add (a, b) = a+b;;
val add : int * int -> int = <fun>
# add (1, 2);;
- : int = 3
# let add2 a b = a+b;;
val add2 : int -> int -> int = <fun>
# add2 1 2;;
- : int = 3
# let plus1 = add2 1;;
val plus1 : int -> int = <fun>
# plus1 4;;
- : int = 5
* |> : 역함수 응용 프로그램을 나타낸다. 함수를 적용하려는 값 뒤에 넣을 수 있습니다(+ 및 몇 가지 추가 매개 변수).
중첩된 함수 호출을 피하는 좋은 방법이다.
# let (|>) x f = f x;;
val ( |> ) : 'a -> ('a -> 'b) -> 'b = <fun>
# 0.0 |> sin;;
- : float = 0.
* Conditional expression
- if <조건(T&F)> then <결과> else <대안>
# if true then 1 else 0;;
- : int = 1
- if <> then <>
else if <> then <>
else <>;;
# let rec gcd x y = if x > y then gcd (x ‐ y) y else if x < y then gcd (y ‐ x) x else x;;
val gcd : int ‐> int ‐> int = <fun>
- recursive function (use let rec)
# let rec factorial x = if x = 0 then 1 else x * factorial (x - 1);;
val factorial : int -> int = <fun>
# factorial 4;; --> 4*3*2*1 = 24
- : int = 24
- mutually recursive functions (use let rec and)
# let rec even x = if x = 0 then true else odd ( x - 1 ) and odd x = if x = 0 then false else even (x - 1);;
val even : int -> bool = <fun>
val odd : int -> bool = <fun>
-Nesting of definitions (정의중첩)
- let <variable> = <expr1> in <expr2>
<Lamda>
- Anonymous function
let <name> = fun <formal parameters> -> <body>
- Anonymous recursive function
let rec <name> = fun <formal parameters> -> <body>
아래의 두 함수는 같은 것이다.
#let x = 2 in # (fun x y -> x + y ) 2 4;;
let y = 4 in - : int = 6
x + y ;;
- : int = 6