함수 정의
- def로 정의한 것은 type이 없으며 object나 class내부여야 한다.
- val로 정의한 것은 type을 가지며
andThen
과 같은 추가 함수를 사용할 수 있다 - eta expansion : def 함수를 val 형식으로 사용하려면
f1 _
과 같이 underbar 사용하면 변환된다. 필요하면 f1 _:String
같이 type 붙여주자
curried function
- 인자들을 사용 순서에 따라 () 그룹으로 분리
- implicit 인자를 전달할때에도 흔히 사용된다
- generic 사용하는 경우 함수 인자들의 type inference는 그룹별로 한번에 일어나므로 아래와 같은 경우 컴파일 되지 않는다. currying을 사용하면 T가 Int라는 것을 컴파일러가 알고 에러 없이 컴파일된다.
partial function
PartialFunction
trait을 사용하여 정의하며 isDefinedAt
, apply
함수를 지정해야 한다- case 문으로 정의할 수도 있고
orElse
등으로 compose 가능
lift
- partial function에 사용하면 whole function이 되고 Option[결과값 type]의 값을 가진다
- cats의 Functor에도 lift 사용할 수 있다. Functor의 내용에 적용할 함수를 미리 지정하는 셈
Functor
- fproduct
map과 동일하나 인자와 결과값을 tuple로 반환한다. 바로 Map에 인자로 줄 수 있다. - compose
같은 Functor끼리 결합
- 기본적으로 Either는 내부에 형을 2개 포함하므로 바로
Functor[Either]
와 같이 사용할 수 없다.
하지만 type 문으로 형을 하나 지정해주면 다음과 같이 사용할 수 있다.
- 아래의 경우 monad 속에 monad가 있는 경우, 내부의 monad가 아닌 값을 liftF를 사용하여 monad를 적용시키고 있다. 함수가 아닌 type을 lift한다고 연상하면 될듯.