fp-ts中T[]经返回Option的映射转为Option<T[]>的高效实现方案
解决方案
你要实现的T[] -> Option<T[]>转换可以直接用fp-ts内置的Array.traverse方法完成,它天然合并了map和sequence两个步骤,且针对Option的Applicative实例具备短路特性:只要遇到第一个返回None的元素,就会直接终止后续所有元素的处理,完全符合你要的优化需求。
核心实现代码
import * as A from 'fp-ts/Array' import * as O from 'fp-ts/Option' import { pipe } from 'fp-ts/function' // 转换逻辑,签名完全匹配你的需求:<T>(mapFn: (t: T) => O.Option<T>) => (arr: T[]) => O.Option<T[]> const arrayTraverseMap = A.traverse(O.Applicative) // 单独使用示例 const result = arrayTraverseMap(mapFn)(['foo', 'bar', 'baz'])
适配你原外层包裹Option的场景
可以直接把原来的两步合并成一步,代码更简洁:
pipe( O.some(['foo', 'bar', 'baz']), // O.Option<string[]> O.chain(A.traverse(O.Applicative)(mapFn)), // 直接得到 O.Option<string[]> )
注意:你原示例中导入
Option时用了别名E,但后续代码使用的是O,实际使用时统一别名即可。
内容的提问来源于stack exchange,提问作者james2mid
相关产品推荐
相关产品推荐

