Hmm, it looks like you’re right. I could swear I’ve used flatMap without a closure before…oh well, looks like that’s what happens when you send code without running it in a Playground.
Saagar Jha > On Feb 13, 2017, at 5:33 PM, Jon Shier <j...@jonshier.com> wrote: > > According to the compiler, the closure argument for flatMap is not optional > or defaulted, so it’s always required. I think it should default to { $0 }, > but whatever. > > > Jon > >> On Feb 13, 2017, at 8:26 PM, Saagar Jha via swift-users >> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote: >> >> flatMap was designed to work this way. How I rationalize it is that flatMap >> “extracts” the value from an array’s elements and expands it. For an Array, >> this is just taking out the individual Elements, but for an Optional, which >> a “wrapper” around one value, it just takes this value out. Optionals with >> no value (the .none case, or nil as it’s more commonly known) have nothing >> to contribute and thus are filtered out. >> >> Saagar Jha >> >> P.S. You can call flatMap without a closure: deep.flatMap().flatMap() >> >>> On Feb 13, 2017, at 4:31 PM, Maxim Veksler via swift-users >>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote: >>> >>> Hi everyone, >>> >>> I've discovered today that Swift will actually choose 2 very differently >>> behaving types of flatMap implementation based on the input signature. >>> >>> For a Sequence of options it will call a flatMap that filters out nil's. >>> For a Sequence of Sequence's it will call a flattening function, without >>> filtering. >>> >>> Leading to code that (IMHO) reads very not inconsistency, and unexpected. >>> Sometime even looking a bit funny such as collection.flatMap.flatMap: >>> >>> 5> let deep = [["1989", nil], [nil, "Red"], [nil, nil]] >>> deep: [[String?]] = 3 values { >>> [0] = 2 values { >>> [0] = "1989" >>> [1] = nil >>> } >>> [1] = 2 values { >>> [0] = nil >>> [1] = "Red" >>> } >>> [2] = 2 values { >>> [0] = nil >>> [1] = nil >>> } >>> } >>> 6> deep.flatMap { $0 } >>> $R1: [String?] = 6 values { >>> [0] = "1989" >>> [1] = nil >>> [2] = nil >>> [3] = "Red" >>> [4] = nil >>> [5] = nil >>> } >>> 7> deep.flatMap { $0 }.flatMap { $0 } >>> $R2: [String] = 2 values { >>> [0] = "1989" >>> [1] = "Red" >>> } >>> I wonder why it was implemented this way? >>> >>> >>> _______________________________________________ >>> swift-users mailing list >>> swift-users@swift.org <mailto:swift-users@swift.org> >>> https://lists.swift.org/mailman/listinfo/swift-users >>> <https://lists.swift.org/mailman/listinfo/swift-users> >> >> _______________________________________________ >> swift-users mailing list >> swift-users@swift.org <mailto:swift-users@swift.org> >> https://lists.swift.org/mailman/listinfo/swift-users >
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users