실패 할 수있는 작업을 작성하려고하지만 롤백 할 수있는 방법이 있습니다.조합 가능한 원자 적 작업
예 : 호텔 방 예약을위한 외부 통화 및 신용 카드 청구를위한 외부 통화. 두 통화 모두 방이 남지 않았거나 신용 카드가 유효하지 않은 경우와 같이 실패 할 수 있습니다. 두 가지 방법 모두 롤백 할 수 있습니다 - 호텔 객실 취소, 신용 카드 취소.
- 원자 (진짜가 아닌) 원자의 이름이 있습니까? 내가 haskell 거래를 검색 할 때마다 나는
STM
이된다. - haskell 또는 다른 언어로 된 추상화, 구성 방법 또는 라이브러리가 있습니까?
이 작업을 추적하고 예외가있는 경우 롤백하는 모나드 Atomic T
을 작성할 수 있다고 생각합니다.
편집 :
이러한 작업은 IO
작업 할 수있다. 연산이 메모리 연산 만인 경우 두 가지 대답이 제시하는 것처럼 STM으로 충분합니다.
예를 들어 예약 호텔은 HTTP 요청을 통해 이루어집니다. 소켓 통신을 통해 레코드를 삽입하는 것과 같은 데이터베이스 작업.
실제 상황에서는 되돌릴 수없는 작업의 경우 작업이 완료되기 전에 유예 기간이 있습니다. 신용 카드 결제 및 호텔 예약은 당일에 해결 될 수 있으므로 그 전에 취소하는 것이 좋습니다.
아,하지만 STM은 IO를 특별히 금지합니다. 이 질문은 필요하다면 두 번째 IO 작업으로 되돌릴 수있는 IO 작업에 대해 묻습니다. –
STM은 IO 작업과 매우 호환되며 직접 수행하지 않습니다 (http://book.realworldhaskell.org/read/software-transactional-memory.html). 모든 IO *가 트랜잭션이 될 수있는 것은 아닙니다 - launchMissiles에 대한 '롤백'작업이 없습니다. – amindfv
'IO'에 특별히 언급 된 질문이 없습니다. 그러나 어떤 경우에있어서, '입출력'모나드는 정보를 돌이킬 수 없게 파괴하는 조작을하고, 그 상태를 복제 할 방법이 없기 때문에 '입출력'에 대한 대답은 할 수 없다는 것입니다. 사실, 'IO' 모나드는이를 위해 특별히 설계되었습니다! –