C# 源代码被列举了不止一次?我可以自己实现这个方法而不会有太多问题。我主要是想知道这是否是一个标准的函数构造,是否可以在核心库中使用,以及它的名称。从上面的答案来看,似乎是顺序和遍历。现在只需要检查F#etc中是否有等价物,如果我必须编写自己的实现,那么给它命

C# 源代码被列举了不止一次?我可以自己实现这个方法而不会有太多问题。我主要是想知道这是否是一个标准的函数构造,是否可以在核心库中使用,以及它的名称。从上面的答案来看,似乎是顺序和遍历。现在只需要检查F#etc中是否有等价物,如果我必须编写自己的实现,那么给它命,c#,scala,haskell,functional-programming,monads,C#,Scala,Haskell,Functional Programming,Monads,源代码被列举了不止一次?我可以自己实现这个方法而不会有太多问题。我主要是想知道这是否是一个标准的函数构造,是否可以在核心库中使用,以及它的名称。从上面的答案来看,似乎是顺序和遍历。现在只需要检查F#etc中是否有等价物,如果我必须编写自己的实现,那么给它命名。啊,我明白了。我已经更新了我的答案,但是没有,我不知道有什么标准函数可以做到这一点,所以我无法帮助命名(顺便说一句,命名很难!),这看起来很简单 let chooseAll source = let anyNone = source


源代码被列举了不止一次?我可以自己实现这个方法而不会有太多问题。我主要是想知道这是否是一个标准的函数构造,是否可以在核心库中使用,以及它的名称。从上面的答案来看,似乎是
顺序
遍历
。现在只需要检查F#etc中是否有等价物,如果我必须编写自己的实现,那么给它命名。啊,我明白了。我已经更新了我的答案,但是没有,我不知道有什么标准函数可以做到这一点,所以我无法帮助命名(顺便说一句,命名很难!),这看起来很简单
let chooseAll source =
    let anyNone = source |> Seq.exists Option.isNone
    if anyNone then None else Some source

let s = [Some 1; Some 2; None]
let result1 = s |> chooseAll // None
let s = [Some 4; Some 5]
let result2 = s |> chooseAll // Some {4;5}
public static Option<IEnumerable<T>> AllSome<T>(this IEnumerable<Option<T>> input)
            where T : class
            => (input.All(o => o.IsSome)) ?
                new Some<IEnumerable<T>>(input.Select(o => (o as Some<T>).Value)) :
                new None<IEnumerable<T>>() as Option<IEnumerable<T>>;
public class Option<T>
    where T: class
{
    protected T value;
    public bool IsSome => value != default(T);
}

public class Some<T> : Option<T>
    where T: class
{
    public Some(T value) => base.value = value;
    public T Value => base.value;
}

public class None<T> : Option<T>
    where T: class
{

}
let l1 = [Some 1; Some 2; None]
let l2 = [Some 3; Some 4; Some 5]


let acc (ac: int list option) le = 
    match ac, le with
    | Some ac, Some le -> Some (le::ac)
    | _, _ -> None

//this will reverse the order of elements if all present
let r1 = l1 |> List.fold acc (Some [])
let r2 = l2 |> List.fold acc (Some [])

//the order of elements preserved
let acc2 le (ac: int list option) = acc ac le
let r3 = List.foldBack acc2 l1 (Some [])
let r4 = List.foldBack acc2 l2 (Some [])

//or...
let r3b = l1 |> List.foldBack acc2 <| (Some [])
let r4b = l2 |> List.foldBack acc2 <| (Some [])
IEnumerable<Option<int>> items = ...;

Option<IEnumerable<int>> result = items.Sequence();