における逆方向状態モナド、バインドの次の定義が受け入れられます。Haskellで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'')
どのように私はコックで受け入れ同様の定義を得ることができますか?
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.
トリックはHaskellで動作します(。うまくいけば、他の誰かがこのスレッドに追加することができます。これをachieveingの他の/より良い方法があるかもしれません) 。 IDKはCoqでどのように動作するのですか?私はある種の 'mutual'キーワードがあると思いますか? –
また、確立された関係を使用して終了を証明する必要があります。私はそれが可能であるかどうかは、 'bind'(多分、よく使われている関係)で何らかの追加的(証拠? –