Nice programing

언제 IORef를 사용해도 괜찮습니까?

nicepro 2020. 12. 1. 19:46
반응형

언제 IORef를 사용해도 괜찮습니까?


항상 나를 혼란스럽게하는 한 가지는 IORef를 사용할 수있는 적절한시기인지 여부입니다. 작업에 IORef를 사용할지 여부를 결정할 때 따라야 할 지침이 있습니까? IORef를 통해 State 모나드를 사용하기에 좋은시기는 언제입니까?


상태와 그 상대 ST는 모두 단위로 실행될 수있는 '모 놀리 식'상태 저장 계산을 생성합니다. 기본적으로 변경 가능한 상태를 결과를 생성하는 데 필요한 중간 데이터로 취급하지만, 그 자체로는 나머지 프로그램에 관심이 없어야합니다.

반면에 IORef 안에 넣는 것은 실행할 '계산'이 아닙니다. IO 내에서 상당히 임의적 인 방식으로 사용될 수있는 단순한 값을 담고있는 상자 일뿐입니다. 이 상자는 데이터 구조 내부에 배치되고, 프로그램의 (IO 부분) 주위에 전달 될 수 있으며, 편리 할 때마다 내용을 교체하고, 함수 등으로 닫을 수 있습니다. 사실, 변수의 지저분한 특성이 상당히 많습니다. C와 같은 언어의 포인터는 IORefs로 모델링 될 수 있으며, 어떤 언어로든 C 코드를 작성할 수 있다는 명성을 유지하고자하는 전문 C 프로그래머에게 큰 도움을 제공 할 수 있습니다. 이것은 확실히주의해서 사용해야 할 것입니다.

그럼에도 불구 하고 단일 코드 블록에서 변경 가능한 상태 조각과의 모든 상호 작용을 분리하는 것은 때로는 매우 다루기 어렵지만, 완전히 불가능하지는 않습니다. 일부 상태 조각은 단순히 전달되어야하고 데이터 구조 내부에 넣어야합니다. 상자 접근 방식이 유일한 옵션 일 수 있습니다. 48 시간 내 스키마 작성 튜토리얼의 변경 가능한 상태소개 하는 (그런데 적극 권장 됨)에서 예제를 제공합니다. (Scheme 인터프리터의 특정 디자인에서 Scheme 환경을 모델링하기 위해 State 또는 ST가 아닌 IORef를 사용하는 것이 왜 가장 적절한 지에 대한 좋은 토론을 보려면 링크를 참조하십시오.)

요컨대, 이러한 환경은 임의의 방식으로 중첩되어야하며 사용자 상호 작용의 인스턴스간에 유지 (define x 1)되어야합니다 (Schema REPL에 입력하면 사용자가 나중에 입력 x하고 값으로 1을 반환 할 수 있어야 함 ). 모델링 Scheme 함수 (Schema 함수가 생성 된 환경에서 닫히기 때문에) 등

요약하자면, 작업이 이에 적합하다고 생각되면 State가 가장 깨끗한 솔루션을 제공하는 경향이 있다고 말하고 싶습니다. 여러 개의 개별 상태가 필요한 경우 ST가 도움이 될 수 있습니다. 그러나 상태 저장 계산이 다루기 어렵거나 자체 코드에서 잠글 수없는 경우 상태가 복잡한 프로그램 수명의 상당 부분 동안 수정 가능한 형태로 유지되어야하는 경우 IORefs는 적절한 것.

그런 다음 IO 코드에 의해 제어 된 방식으로 전달되고 상호 작용할 수있는 일종의 변경 가능한 상태가 필요한 경우 STM 및 해당 TVar를 확인하십시오! 해결 만들기 위해 그들은 사실, 너무 많은 그래서, 동시성의 존재 훨씬 좋네요 몇 가지 사실 간단한 동시성 관련 작업을. 그러나 이것은 실제로 질문과 관련이 없으므로 자세히 설명하지 않겠습니다. :-)


흠. 변경 가능한 상태가 필요하지만 단일 스레드 환경에있을 때 IORef를 사용합니다. 또는 동기화 변수에 의해 유지되는 더 큰 구조 내부에 변경 가능한 필드를 원할 때.

일반적으로 MVar를 사용합니다. 더 강력한 의미를 가지고 있습니다.


개인적으로 IORefs를 이미 사용 하고있을 때만 s 를 사용하는 것이 좋습니다 IO. 그렇지 않은 경우, State우수한 성능이 필요하지 않는 한 항상 ST. State몇 가지 도우미 함수 를 사용하여 모나드 와 함께 여러 상태 스레드를 사용할 수 있습니다. 상태를 튜플 또는 레코드로 만들고 각 필드를 개별적으로 설정, 가져 오기 또는 업데이트하는 함수를 정의하기 만하면됩니다.

특히 일반적으로 StateT s IO. 이미에있는 경우 IO이미 변경 가능한 상태가 있으므로 사용하는 것이 ReaderT (IORef s) IO좋습니다.


STRef상태가 지역화되고 환경과의 상호 작용이 필요하지 않을 때 사용 합니다.

참고 URL : https://stackoverflow.com/questions/1931875/when-is-it-ok-to-use-an-ioref

반응형