Effect System - Intro

Tags
Published
Author
최근 Effect System 이라는 생소한 개념을 접하면서 학습한 내용을 정리한다.

Effect System

함수의 부수효과를 타입시스템을 통해서 추적 및 제어하는 시스템이다.

Side Effect

부수효과는 특정 함수가 순수함수가 될 수 없게하는 명시되지 않은 효과를 의미한다.
흔히 접할 수 있는 부수효과에는 Exception 이 있다. DB 접근시 발생하는 Exception, Network 통신시 발생하는 Exception 를 부수효과로 볼 수 있다.
하지만 꼭 시스템 외부와의 상호작용 하는 경우가 아니더라도 부수효과는 발생한다. 함수 실행 시 전역변수를 수정하는 경우도 명시되지 않은 효과를 가지므로 부수효과로 볼 수있다.

Effect System 의 역할

effect system 은 타입으로 부수효과를 명시할 수 있게 지원한다.
아래는 Effect System 을 지원하는 ZIO 의 EffectType 예시이다.

Scala - ZIO

val program: ZIO[Any, IOException, Unit] = for { content <- ZIO.readFile("input.txt") _ <- ZIO.writeFile("output.txt", content) } yield ()
ZIO 는 ZIO[R, E, A] 라는 코어 타입을 갖는다.
  • R: 함수의 실행에 필요한 의존성
  • E: 에러 시 반환되는 타입
  • A: 성공 시 반환되는 타입
위 코드를 간단히 해석해보면 program 이라는 함수는 아래와 같은 성질을 가진다.
  • 어떤 의존성도 필요하지 않음 (Any)
  • IOExecption 이 발생할 수 있음
  • 성공 시 Unit 타입을 반환함

Effect System 의 장점

위와 같이 Effect Type 을 활용하면 특히 동시성 프로그래밍에 강점을 가지게 된다. Effect Type 은 부수효과를 포함한 Type 이다.
그리고 Effect Type 은 단순히 부수효과의 종류를 표시하는 것이 아니라, 실제 실행 계획을 표현하는 타입이다.
이렇게 실행 계획 자체가 타입으로 존재하기 때문에 Lazy Evaluation 이 가능하다. 그리고 Lazy Evaluation 이 가능하면 아래와 같은 이점이 있다.
  • 실행 계획을 타입으로 다루기 때문에 동시성 처리를 안전하게 조합 가능
  • 타입으로 표현된 실행 계획들을 조합에 유리
 

Reference