본문 바로가기
Swift

Custom Operator |>

by zinozino 2022. 11. 29.

해당 포스트를 공부하며 정리한 글입니다.

https://www.pointfree.co/episodes/ep1-functions

 

Episode #1: Functions

Our first episode is all about functions! We talk a bit about what makes functions special, contrasting them with the way we usually write code, and have some exploratory discussions about operators and composition.

www.pointfree.co

 

연산자 사용자 정의를 알아보도록 하겠습니다.

 

|> 는  왼쪽에 입력받은 것을  오른쪽에서 처리하여 출력한다는 뜻의 연산자로 Elixir, Haskell에서 많이 사용하는 연산자입니다.

이것을 Swift  연산자 정의를 통해서 구현하겠습니다.

 

infix operator |> (중위 연산자 \>를 정의하겠다.)

 

func |> <A,B>(x:A, f: (A) -> B) -> B { //함수 인자로 A,B라는 제네릭타입으로 받습니다.
	return f(x)
}

함수를 파라미터로 받는 것이 아직 어색하지만  함수형 프로그래밍을 한다면 적응해야겠습니다. 

 

이번엔

x를 받아서 1 증가하는 함수를 하나 만들었습니다.

func increase(x: Int) {
	return x + 1
}

2를 입력받아서 increase함수에 넣어주면 3을 리턴받게 됩니다.

2 |> increase // 3

 

 

만약 increase함수에서 나온 3으로 다시 입력받아 4로 만들고 싶다면 어떻게 해야할까요?

2 |> increase \> increase

 

increase함수를  |>연산자로 붙이면 될 것 같습니다. 

하지만.. 에러가 뜨게됩니다.

 

DefaultPrecedence 그룹을 따르는 연산자에 우선순위가 정해지지않은 표현이라는 뜻..

 

연산자에 ( )를 넣어서 우선순위를 정해주면 가능합니다.

(2 |> increase) |> increase // 4

 

하지만 연산자의 우선순위를 정의한다면  ()를 넣지않고도 사용가능합니다.

 

 

연산자 우선순위를 정할 떄는 precedencegroup 라는  키워드를 통해서 정의 가능합니다.

precedencegroup SubstitutionPrecedence {
    
    associativity: left // 연관된 우선순위는 left부터다!
    
}

 다시 숫자 4를만드는 작업를 해보면 ( ) 없이도 사용가능합니다.

infix operator |>: SubstitutionPrecedence

2 |> increase \> increase // 4

 

 

'Swift' 카테고리의 다른 글

FP에서 Setter 사용법  (0) 2022.12.10
Custom Operator =>  (0) 2022.12.02
Currying  (2) 2022.11.30
ObjectIdentifier을 이용한 DI - 2  (1) 2022.04.13
ObjectIdentifier을 이용한 DI  (3) 2022.04.06