2015-04-05 23 views
0

我做,做哈斯克爾:返回值,州和國家的單子

(a->Bool) -> [a] -> State [a] [a] 

,我想知道如果有一個簡單的方法去通過列表存儲功能「失敗」那沒項目是否將謂詞作爲狀態和「傳遞」項作爲最終返回的值? 你會看到返回值和狀態。樣品:

*CL> runState (func (<3) [1, 2, 3]) [] 
([1, 2], [3]) 
*CL> runState (func even [1, 2, 3]) [10] 
([2], [10, 1, 3]) 

我看着漫長而艱難的答案,並沒有發現在這個具體情況任何東西。我知道我可以像現在這樣做,但我特別想知道我是否可以按照上述方式做到這一點。

回答

4

你並不真的需要使用狀態這一點,因爲你可以返回一對(passed, failed),但你可以這樣做:

partitionSt :: (a->Bool) -> [a] -> State [a] [a] 
partitionSt f l = do 
    let (passed, failed) = partition f l 
    s <- return passed 
    put failed 
    return s 

partitionSt f l = return passed <* (put failed) 
    where (passed, failed) = partition f l 
+0

我不能讓(通過,失敗)= partitionSt因爲它的狀態[a] [a] – Hkellynewman 2015-04-05 16:37:05

+0

沒有完全回答我的問題,但你確實讓我走上了正確的軌道,通過顯示我可以綁定回報。謝謝 – Hkellynewman 2015-04-05 17:02:46

+0

第一種方法可以簡化,因爲'返回通過'不會做任何事情。只需跳過該行並使用'put failed;返回通過' – dfeuer 2015-04-05 21:17:06

0

好吧,我想通了。我應該綁定返回值和狀態的下一個迭代並返回它,否則只是更新狀態並迭代。通過向我展示我可以綁定返回值,李確實讓我走上了正確的軌道。