의 반대 상태 모나드는, 바인드의 다음과 같은 정의가 허용됩니다 :COQ
type RState s a = s -> (a, s)
bind :: RState s a -> (a -> RState s b) -> RState s b
bind sf f = \s ->
let (a, s'') = sf s'
(b, s') = f a s
in (b, s'')
어떻게 COQ에 의해 허용 유사한 정의를 얻을 수 있나요?
Definition RState (S A : Type) : Type := S -> A * S.
Definition bind (S A B : Type) (sf : RState S A) (f : A -> RState S B) : RState S B :=
fun s =>
let (a, s'') := sf s' in
let (b, s') := f a s in
(b, s'').
그러나 다음과 같은 오류 메시지와 함께 실패합니다 : 내 시도는
Error: The reference s' was not found in the current environment.
트릭은 하스켈에서 작동 (. 바라건대 다른 사람이이 글에 추가 할 수 있습니다.이 achieveing의 다른/더 나은 방법이있을 수 있습니다) . IDK는 Coq에서 어떻게 작동하지만 '상호'키워드가 있다고 생각합니까? –
또한 잘 설립 된 관계를 사용하여 해지를 증명해야합니다. 나는 이것이 가능한지 확실치 않다. 'bind'에서 어떤 종류의 추가 (증명?) 인수를 취하지 않으면 (어쩌면 잘 사용 된 특별한 관계). –