[Haskell] 변경 가능한 변수 (mutable variable)
하스켈은 순수한 상수와 함수만을 기반으로 한 수학적이고 안정적인 코드를 구성하는 것을 골조로 삼지만.
아무래도 현실과 이상에는 항상 거리가 있다.
세상에 mutation 없이 프로그램을 만든다는게 가당키나 하겠는가? 그게 되는건 진짜 수학계산밖에 없다.
결국에는 내부 가변성 처리를 통해서 껍데기는 안전한 것처럼 만들고 변경을 좀더 신경써서 제한하는 정도가 현실이다.
Rust가 동시접근에 대해서는 내부 가변성 패턴으로 은밀하고 과격한 동작을 구현했듯이, Haskell도 모나드를 통해 가변성을 간접적으로 제어하는 형태를 취한다.
IORef를 통한 변수 제어
IORef는 내부 가변성을 제공하는 가장 대표적인 타입이다. IORef로 생성된 값은 그들만의 특수한 함수를 통해 값을 변경하거나 읽을 수 있다.
아래는 그에 대한 예제 코드다.
modifyIORef는 기대한대로 ref라는 변수에 저장된 값을 변경한다.
그리고 이후에는 readIORef 등을 통해 값을 읽어와서 사용할 수 있다.
이 기능들은 Thread safe하지는 않다.
동시성 코드를 작성할 때는 대신 atomicModifyIORef 같은 동시성 버전의 쓰기 함수를 사용해야 한다.
참조
https://wiki.haskell.org/Mutable_variable
https://hackage.haskell.org/package/base-4.19.1.0/docs/Data-IORef.html