首页 > 解决方案 > 两个功能“组合”(非组合)的无点样式

问题描述

我在 TypeScript 中执行此操作,但可以使用具有 FP 能力的另一种语言进行响应。

说我有const foo = (a:A) => Mconst 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)

但是,如果使用不同的参数,这是无效foobar。我可以使用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]>

但这似乎是为了获得免费积分而作弊。

标签: typescriptfunctional-programmingpointfreefp-ts

解决方案


推荐阅读