私は述語p
とリストを取る関数を書いています。 は([value],[state])
を返します。最初のリストにはp
を渡す要素が含まれ、2番目の要素には含まれていない要素が含まれています。私は状態モナド:値を変更せずに状態を変更する
runState (myFunc even [1,2,3,4,5]) []
を実行したときしかし、私は失敗した要素が誤っ[value]
に格納されている([2,4,5,3,1],[5,3,1])
を取得します。これは状態と値の両方を更新するget
が原因だと信じていますが、状態を更新して値だけを残す方法を見つけることができませんでした。
myFunc :: (a->Bool) -> [a] -> State [a] [a]
myFunc _ [] = do
a <- get
return a
myFunc p (x:xs) = do
if (p x) then do
s <- myFunc p xs
let ret = (x:s)
return ret
else do
s <- get
put(x:s)
myFunc p xs
私はあなたの例をコンパイルするためにいくつかのコードの配置の問題を修正 - 彼らはあなたの好みに合わせていない場合は、それらを元に戻す気軽に! – Alec
あなたの基本ケースが問題です。また、関数は '([value]、[state])'を返さず、 'State [a] [a]'を返します。しかし、それを変更したいのであれば、それもベースケースにあるでしょう。 – Alec