を流し:Applicativeの状態のインスタンス - データの順序は、私は、このようなタイプのためのApplicativeのインスタンスを実装しようとしています
newtype State s a = State {runState :: s -> (a, s)}
私は(< *>)機能のためのいくつかのさまざまなアイデアを持っています。私の心に来る、それを実装する 一つの方法は、
1(またはそれらのんでも任意の)(<*>) :: State s (a -> b) -> State s a -> State s b
State f <*> State s = State $ do
(fa, fs) <- f
let (sa, ss) = s fs
return (fa sa, ss)
それとも
(<*>) :: State s (a -> b) -> State s a -> State s b
State f <*> State s = State $ do
(sa, ss) <- s
let (fa, fs) = f ss
return (fa sa, fs)
は正しいと理由ですか?
これらは両方とも型チェックであり、「状態」変換の順序によってのみ異なります。私は別のものより1つを好む良い理由を見つけることができません...
この質問は、[nerd snipe](https://xkcd.com/356/)の熟した機会のようです。 'State =' = g = State $ \ s - > let {(u、x)}を考えるための 'State'のようなモナドのための' = ft; (t、y)= runState(g x)s}を(u、y) 'とする。どのように 'x'、' y'が上から下にいくのかを観察するが、 's'、' t'、 'u'は下から上に行く。まだ私の脳を傷つける:) –
あなたがそれを見たことがないなら、[これは好きかもしれません](https://lukepalmer.wordpress.com/2008/08/10/mindfuck-the-reverse-state-monad/) – luqui
@BenjaminHodgsonそれは奇妙に奇妙です – 4castle