Swift中flatMap的定义

Swift中flatMap的定义,swift,monads,functor,flatmap,Swift,Monads,Functor,Flatmap,我在研究一个函子和单子。所以我知道函子使用map,单子使用flatMap,而且map和flatMap的定义如下所示 枚举框{ 案例(T) 空箱 } 分机盒{ 函数映射(f:@escaping(T)->U)->Box{ // ... } } 分机盒{ func平面图(f:(T)->Box)->Box{ // ... } } 我完全明白了这些都使用了不同的f参数(谢谢) 然后,我只想检查Optional中map和flatMap的定义,Result和Array。因为我听说那些也是单子。在Option

我在研究一个函子和单子。所以我知道函子使用
map
,单子使用
flatMap
,而且
map
flatMap
的定义如下所示

枚举框{
案例(T)
空箱
}
分机盒{
函数映射(f:@escaping(T)->U)->Box{
// ...
}
}
分机盒{
func平面图(f:(T)->Box)->Box{
// ...
}
}
我完全明白了这些都使用了不同的
f
参数(谢谢)

然后,我只想检查
Optional
map
flatMap
的定义,
Result
Array
。因为我听说那些也是单子。在
Optional
Result
中,定义与上面的自定义
map
flatMap
相同

但在
数组中
,则不是

func映射(u-transform:(元素)抛出->T)再抛出->[T]
func flatMap(transform:(元素)抛出->SegmentOfResult)返回->[SegmentOfResult.Element],其中SegmentOfResult:序列
我现在有点糊涂了。因为我知道monad会应用一个函数,将包装值返回给包装值,所以我希望
flatMap
的定义如下所示(绝对错误)

func平面映射(u变换:(元素)抛出->[T])再抛出->[T]
但事实并非如此

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

你在期待什么

func flatMap<T>(_ transform: (Element) throws -> Array<T>) rethrows -> Array<T>
func平面映射(u变换:(元素)抛出->数组)再抛出->数组
对于
阵列

如果仔细观察,以上只是您发现的签名的一个特例,当
SegmentOfResult==Array

Array
中的
flatMap
不仅是针对
SegmentOfResult==Array
的情况定义的,也是针对
序列的任何
SegmentOfResult
定义的

为什么??因为我们希望定义函数,以便它们能够处理尽可能多的类型(即尽可能通用)。如果函数映射到任何
序列
,那么
flatMap
也可以工作。也就是说,它不取决于函数具体返回
数组的事实。它只取决于函数返回某种类型的
序列。如果您感兴趣,请查看
flatMap
是如何实现的


出于同样的原因,
flatMap
不仅在
阵列上可用,而且在符合
序列的任何类型上都可用

谢谢你的回复。所以我使用
flatMap
表示
Array
,意思是
[SegmentOfResult.Element]==Array
?若然,原因为何?你能给我一些关于这个的资源吗?你是说为什么
[SegmentOfResult.Element]==Array
?嗯,
SegmentOfResult
Array
,而
Array.Element
T
,所以
[SegmentOfResult.Element]
[T]
,这是说
Array
的另一种方式@InTaekCho