Das kompiliert nicht, weil TConcatIterator<T>
kann nur zwei Enumerables concat, aber was ich brauche ist ein Iterator, der ein Enumerable von Enumerables concats.Wie wird ein IEnumerable eines IEnumerable auf einen einzelnen IEnumerable reduziert?
Haskell hat die concat
Funktion, das dies tut:
concat [[1, 2, 3], [4,5]] => [1, 2, 3, 4, 5]
Die Delphi-Version würde wie folgt aussehen:
class function TForm1.Concat<T>(
const AEnumerable: IEnumerable<IEnumerable<T>>): IEnumerable<T>;
begin
// ???
end;
procedure TForm1.FormCreate(Sender: TObject);
var
InnerList1: IList<Integer>;
InnerList2: IList<Integer>;
OuterList: IList<IEnumerable<Integer>>;
Concated: IEnumerable<Integer>;
begin
InnerList1 := TCollections.CreateList<Integer>([1, 2, 3]);
InnerList2 := TCollections.CreateList<Integer>([4, 5]);
OuterList := TCollections.CreateList<IEnumerable<Integer>>([InnerList1, InnerList2]);
Concated := Concat<Integer>(OuterList);
end;
Wie kann ich implementieren diese in spring4d?
Ich habe gerade entdeckt, dass in Haskell 'SelectMany'' concatMap' oder '= <<' (bind) (in der [] Monade) entspricht, das ist wirklich cool. –