次のタイプの関数が必要です。
f :: [Maybe a] -> Maybe [a]
例えば
f [Just 3, Just 5] == Just [3, 5]
f [Just 3, Nothing] == Nothing
f [] == Just []
を無視することを除いて、catMaybes :: [Maybe a] -> [a]
inと似ていますが、 myは について非常に深刻です。(以下に示すように) 素朴な方法で実装することもできますが、もっと慣用的な方法 (「アプリケーション ファンクター」など) があるかどうか疑問に思っています。Data.Maybe
catMaybes
Nothing
f
Nothing
f
f :: [Maybe a] -> Maybe [a]
f xs = let ys = catMaybes xs
in if length ys == length xs
then Just ys
else Nothing
また
f :: [Maybe a] -> Maybe [a]
f xs = if all isJust xs
then catMaybes xs
else Nothing