【问题标题】:Definition of flatMap in SwiftSwift 中 flatMap 的定义
【发布时间】:2021-05-03 02:46:19
【问题描述】:

我正在研究 functormonad。所以我知道了一个仿函数使用map,一个monad使用flatMap,还有mapflatMap的定义如下所示。

enum Box<T> {
    case some(T)
    case empty
}

extension Box {
    func map<U>(_ f: @escaping (T) -> U) -> Box<U> {
        // ...
    }
}

extension Box {
    func flatMap<U>(_ f: (T) -> Box<U>) -> Box<U> {
        // ...
    }
}

我完全明白那些使用不同的f 参数(感谢this article)。

然后,我只想检查OptionalResultArraymapflatMap 的定义。因为我听说那些也是单子。在OptionalResult 中,定义看起来与上面的自定义mapflatMap 相同。

但在Array,没有。

func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]

func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence

我现在有点困惑。因为我知道 monad 应用了一个将包装值返回到包装值的函数,所以我希望 flatMap 的定义如下所示(绝对错误)。

func flatMap<T>(_ transform: (Element) throws -> [T]) rethrows -> [T]

但无论如何都不是。

我错过了什么吗?我误解的重点在哪里?

【问题讨论】:

    标签: swift monads functor flatmap


    【解决方案1】:

    你期待

    func flatMap<T>(_ transform: (Element) throws -> Array<T>) rethrows -> Array<T>
    

    Array

    如果你仔细观察,上面只是你找到的签名的一个特例,当SegmentOfResult == Array&lt;T&gt;

    Array 中的flatMap 不仅适用于SegmentOfResult == Array&lt;T&gt; 的情况,而且适用于任何SegmentOfResult,即Sequence

    为什么?因为我们想定义函数,以便它们在尽可能多的类型上工作(即尽可能通用)。事实证明,如果函数映射到任何SequenceflatMap 也可以工作。也就是说,它不依赖于函数专门返回Array 的事实。这仅取决于函数返回某种Sequence 的事实。如果您有兴趣,请查看 flatMap 是如何实现的 here

    出于同样的原因,flatMap 不仅适用于 Array,它适用于任何符合 Sequence 的类型!

    【讨论】:

    • 感谢您的回复。所以我用flatMap 表示Array&lt;T&gt;,意思是[SegmentOfResult.Element] == Array&lt;T&gt;?如果是这样,为什么?你能给我任何关于这方面的资源吗?
    • 你的意思是为什么[SegmentOfResult.Element] == Array&lt;T&gt;?嗯,SegmentOfResultArray&lt;T&gt;Array&lt;T&gt;.ElementT,所以[SegmentOfResult.Element][T],这是Array&lt;T&gt; 的另一种说法。 @InTaekCho
    猜你喜欢
    • 2016-09-02
    • 2018-08-23
    • 2017-05-15
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多