Open shippingpark opened 2 months ago
a(b(c()))
self.incr().square()
<- 메서드 체인 pipe-forward operator
func |> <A, B>(a: A, f: (A) -> B) -> B {
return f(a)
}
2 |> incr |> square
Adjacent operators are in non-associative precedence group 'DefaultPrecedence'
precedencegroup ForwardApplication {
associativity: left
}
infix operator |>: ForwardApplication
### 닷 체이닝 -> FreeFunction + 연산자를 활용한 컴포지션
**before**
```swift
2.incr().square() // 9
after
2 |> incr |> square // 9
머치 베러 굳~
extension Int {
func incrAndSquare() -> Int {
return self.incr().square()
}
}
이것은(메서드 컴포지션) 작동하지만 많은 일이 벌어지고 있습니다! 5줄의 코드를 작성했고, 4개의 키워드를 사용했으며, 유형을 지정해야 했고, 우리가 신경 쓰는 부분인 square().incr()을 확대하면 전체 그림에서 아주 작은 부분입니다. 컴포지션에 이렇게 많은 전문 용어와 노력이 필요하다면 그만한 가치가 있는지 자문해봐야 합니다.
// valid:
2.incr().square()
// not: .incr().square() incr().square()
> 기본적으로 재사용성이 떨어집니다!! (메서드는)
(...등등)
### Whats the Point?
* 함수는 메서드가 할 수 없는 방식으로 합성할 수 있음
* 함수도 다양한 방식으로 범위를 지정할 수 있음
* 구조체와 열거형에 정적 멤버인 함수를 정의할 수 있음
* **함수를 두려워하지 마세요!**
MONDAY JAN 29, 2018