Ocaml Study

[Ocaml] 함수표현, Currying, if then else, recursive, in

Study Seol 2022. 4. 7. 00:37
728x90

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 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

728x90