我在 TypeScript 中执行此操作,但可以使用具有 FP 能力的另一种语言进行响应。
说我有const foo = (a:A) => M
和const bar = (b:B) => N
。我想“并行”运行这些函数(不必是实际的并行 IO,但它们不相互依赖),而是通过以无点方式定义“组合”。
如果它们实际上是可组合的(比如a
返回B
而不是M
),我可以写
const composed = flow(foo, bar) // (a:A) => N
相反,我想要某种方式将它们组合起来(让我们称之为 this magicCompose
),这样我的无点风格就会产生
const newFn = magicCompose(foo, bar) // (a:A, b:B) => [M,N] or ({a:A, b:B}) => [M,N] or (p:[A,B]) => [M,N]
这是一种可能吗?
fp-ts
在 TypeScript 中使用,我sequenceT
可以将它们视为读者并像这样组合它们
const _ = sequenceT(reader)(foo, bar)
但是,如果使用不同的参数,这是无效foo
的bar
。我可以使用local: (E => R) => (Reader<E, any>) => Reader<R, any>
,但是我必须断点来写
const _ = sequenceT(reader)(
local((params:{a:A,b:B}) => params.a)(foo),
local((params:{a:A,b:B}) => params.b)(bar)) // Reader<{a:A,b:B}, [M,N]>
这是有效({a:A,b:B}) => [M,N]
的,但不幸的是它不是无点的。如果我要制造像_a = Lens.fromProp<{a:A,b:B}>()('a')
然后_b = Lens.fromProp<{a:A,b:B}>()('b')
有
const _ = sequenceT(reader)(
local(_a.get)(foo),
local(_b.get)(bar)) // Reader<{a:A,b:B}, [M,N]>
但这似乎是为了获得免费积分而作弊。