我在寫一個函數,它需要一個謂詞p
和一個列表。它 返回([value],[state])
其中第一個列表包含通過p
的元素,第二個包含不包含的元素。然而,當我運行State Monad:修改狀態而不修改值
runState (myFunc even [1,2,3,4,5]) []
我得到([2,4,5,3,1],[5,3,1])
,其中失敗的元素被不正確地存儲在[value]
。我相信這是由於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