I tip bir işlev gibi olacaktır:catMaybes gibi Haskell işlev ancak sahip olan tip [Belki] -> Belki [a]
f :: [Maybe a] -> Maybe [a]
ör Benim f
Nothing
hakkında çok ciddi iken bu catMaybes
, Nothing
görmezden hariç
f [Just 3, Just 5] == Just [3, 5]
f [Just 3, Nothing] == Nothing
f [] == Just []
Bu Data.Maybe
içinde catMaybes :: [Maybe a] -> [a]
benzer.
f :: [Maybe a] -> Maybe [a]
f xs = let ys = catMaybes xs
in if length ys == length xs
then Just ys
else Nothing
veya
f :: [Maybe a] -> Maybe [a]
f xs = if all isJust xs
then catMaybes xs
else Nothing
Bir buluşsal keşif olarak - eğer tipik bir liste işlevi yazıyorsanız ve 'length' (özellikle bir kereden fazla kullanıyorsanız) ile kendinizi buluyorsanız, muhtemelen yanlış bir şey yapıyorsunuz demektir. Haskell'deki çoğu kod için uygun değil. Bu her zaman böyle değildir, ama öğrenirken, onu kullanmamanın yanından geçmelisin. :-) – shachaf
Şüpheniz olduğunda, [hoogle] (http://www.haskell.org/hoogle/?hoogle=%5BMaybe+a%5D+-%3E+Maybe+%5Ba%5D). Hoogle'da [Belki a] -> Belki [a] 'aradım ve aşağıda listelenen doğru cevabı aldım ('sequence'). – aaronlevin
Ben 'hoogle'd ve 'catMaybes' fark ettim. 'sequence' listedeki ilk oldu. Onu görmezden geldim çünkü bu tür 'Belki' değil, 'Monad' ve bağlantıyı tanıyamadım. – Causality