私はタイプと機能を持っているしたいと思います:catMaybesのようなHaskellでは関数が、型を有するが、[たぶん] - >たぶん、[A]
例えばf :: [Maybe a] -> Maybe [a]
f [Just 3, Just 5] == Just [3, 5]
f [Just 3, Nothing] == Nothing
f [] == Just []
それはそのcatMaybes
除き、Data.Maybe
でcatMaybes :: [Maybe a] -> [a]
に似ている私のf
はNothing
について非常に深刻でありながら、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
一般的なリスト関数を書いていて、 'length'を使って自分自身を見つけた場合(特に複数回使用する場合)、おそらく何か間違っているでしょう。 Haskellのほとんどのリストコードには適していません。それは必ずしも当てはまるわけではありませんが、あなたが学んでいるときに、あなたはそれを使用しない側で誤りを犯すべきです。 :-) – shachaf
不明な点がある場合は、[google](http://www.haskell.org/hoogle/?hoogle=%5BMaybe+a%5D+-%3E+Maybe+%5Ba%5D)。私はHoogleの '[Maybe a] - > Maybe [a]'を検索し、正しい答えを以下に列挙しました( 'sequence')。 – aaronlevin
私は 'それをホッとして' catMaybes'に気づいた。 'sequence'はリストの最初のものでした。私はそれが無視されました。なぜなら、タイプは「Maybe」ではなく「Monad」であり、接続を認識できませんでした。 – Causality