これは Haskell で動作します:
combine :: Maybe a -> Maybe [a] -> Maybe [a]
combine Nothing _ = Nothing
combine _ Nothing = Nothing
combine (Just d) (Just xs) = Just (d:xs)
sequence :: [Maybe a] -> Maybe [a]
sequence [] = Just []
sequence (a:xs) = combine a (sequence xs)
しかし、それがあなたが望むことをするかどうかはわかりません:
λ> sequence [Just 1, Just 3, Just 4]
Just [1,3,4]
λ> sequence [Just 1, Nothing, Just 4]
Nothing
λ> sequence []
Just []
わかりました、翻訳スキームを見つけました-しかし、今はそれを正しくテストする方法がないため、保証はありません
sequence :: [Maybe a] -> Maybe [a]
sequence [] = Just []
sequence [x:xs] = combine x (sequence xs)
ただし、空のリストと署名についてはわかりません-申し訳ありません
とにかく、与えられたリストの頭を末尾の再帰的に計算されたシーケンスと組み合わせるという考えを再利用できれば、問題ないはずです
これはクリーンを使用して私にとってはうまくいきます
IDE をダウンロードし、プロジェクトを作成し、モジュールを 1 つ追加しました。
module seq
:: MayBe a = Just a | Nothing
Start = sequence [Just 3, Just 4, Just 5]
combine Nothing _ = Nothing
combine _ Nothing = Nothing
combine (Just d) (Just xs) = Just [d:xs]
sequence [] = Just []
sequence [x:xs] = combine x (sequence xs)
これをコンパイルし、プロジェクトを更新して実行しました-そして、ここでこれは機能します