문제

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

도움이 되었습니까?

해결책

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

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

아직도, 그것은 때때로입니다 극도로 단일 코드 블록에서 변동성 상태와의 모든 상호 작용을 분리하는 것은 다루기 힘들어야합니다. 일부 상태는 단순히 전달되고 데이터 구조 등을 넣어야합니다. 이러한 경우 상자 접근 방식이 유일한 옵션. 그만큼 돌연변이 상태를 소개합니다 48 시간의 튜토리얼 (적극 권장)으로 구성표를 작성하여 예제를 제공합니다. (State 또는 ST와는 달리 Scheme 통역사의 특정 설계에서 체계 환경을 모델링하기 위해 State 또는 ST와는 달리 iorefs를 사용하는 것이 가장 적합한 이유에 대한 훌륭한 논의는 링크를 참조하십시오.)

요컨대, 이러한 환경은 사용자 상호 작용 사례 (a (define x 1) 계획 대체에 입력하면 아마도 사용자가 나중에 입력 할 수 있습니다. x 그리고 값으로 돌아 가기), 내부 객체 모델링 체계 함수를 넣습니다 (체계 기능이 생성 된 환경에 가깝기 때문에) 등.

요약하자면, 작업이 전혀 적합한 것처럼 보이면 상태는 가장 깨끗한 솔루션을 제공하는 경향이 있습니다. 여러 개의 별도의 상태가 필요한 경우 ST가 도움이 될 수 있습니다. 그러나 상태의 계산이 고유 한 코드를 고정시키는 것이 다루기 어려우거나 불가능하다면, 상태는 복잡한 프로그램의 수명의 많은 부분을 위해 수정 가능한 형태로 지속되어야한다면, iorefs는 단지 적절한 것.

다시 한 번, IO 코드에 의해 통제되고 통제 된 방식으로 상호 작용할 수있는 일종의 돌연변이 상태가 필요한 경우 STM과 TVARS를 확인해보십시오! 그들은 동시성이있을 때 훨씬 더 좋았습니다. 실제로 해결하기 위해 약간 동시성 관련 작업은 실제로 간단합니다. 그러나 이것은 실제로 질문과 관련이 없으므로 정교화에 대한 충동에 저항 할 것입니다. :-)

다른 팁

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

일반적으로 mvars를 사용하십시오. 그들은 더 강력한 의미를 가지고 있습니다.

개인적으로 사용하는 것이 좋습니다 IORefs시기 그리고 언제에 당신은 이미 사용하고 있습니다 IO. 그렇지 않으면 항상 State, 우수한 성능이 필요하지 않는 한 ST. 여러 상태의 상태를 사용할 수 있습니다. State 몇 가지 헬퍼 기능을 갖춘 Monad는 상태를 튜플 또는 레코드로 만들고 기능을 정의하여 각 필드를 별도로 설정, 가져 오기 또는 업데이트 할 수 있습니다.

특히, 일반적으로 사용하는 데 많은 점이 없습니다. StateT s IO. 당신이 이미 있다면 IO, 당신은 이미 돌연변이 가능한 상태를 가지고 있으므로, 당신은 그것을 사용할 수도 있습니다 - ReaderT (IORef s) IO 예를 들어.

나는 사용한다 STRef 상태가 현지화되어 환경과의 상호 작용이 필요하지 않은 경우.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top