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