許多高階函數可以根據fold
函數定義。例如,下面是Haskell中filter
和foldl
之間的關係。一元過濾器和摺疊之間的關係
myFilter p [] = []
myFilter p l = foldl (\y x -> if (p x) then (x:y) else y) [] (reverse l)
有自己的單子版本filterM
和foldM
之間的相似關係? foldM
我怎麼寫filterM
?
我很努力地找到一個相當於\y x -> if (p x) then (x:y) else y
的monadic來插入foldM
而沒有成功。
是'myFilter p [] = []'冗餘嗎? –
@ДМИТРИЙМАЛИКОВ - 是的,絕對。 – stackman
請注意,'foldl'是這裏的「錯誤」摺疊,'foldr'是「正確的」摺疊。例如,'myFilter'對於無限列表是'_ | _',而原始'filter'不是(很好,因爲謂詞對於至少一個元素是成立的)。 –