首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将类型化结构与FP-TS合并

将类型化结构与FP-TS合并
EN

Stack Overflow用户
提问于 2021-01-02 13:38:22
回答 1查看 855关注 0票数 3

在使用FP时,我通常会在TaskIO中使用结构。我通过编写一个合并函数和单独的lift函数来解决这个问题,这些函数使它能够与TaskIO一起工作。有关更详细的说明,请参阅包含的代码示例。代码可以工作,但我想知道我编写的自定义函数是否已经以某种形状或形式在FP中可用。

代码语言:javascript
复制
import { deepStrictEqual as assertEqual } from 'assert'
import { IO, of, io, map } from 'fp-ts/lib/IO';
import { sequenceT } from 'fp-ts/lib/Apply';
import { pipe, tupled } from 'fp-ts/lib/function';

type Merge<A, B> = A & B
function merge<A, B>(a: A, b: B): Merge<A, B> {
  return {...a, ...b}
}

type Foo = { foo: 123 }
type Bar = { bar: 456 }
type FooBar = Merge<Foo, Bar>;

const foo: Foo = { foo: 123 }
const bar: Bar = { bar: 456 }
const fooBar: FooBar = merge(foo, bar)

type IOLift<A, AS extends Array<any>, B> = (a: IO<A>, ...as: { [I in keyof AS]: IO<AS[I]> }) => IO<B> 
function ioLift<A, AS extends Array<any>, B>(f: (a: A, ...as: AS) => B): IOLift<A, AS, B> {
  return (...a) => pipe(
    sequenceT(io)(...a),
    map(tupled(f))
  )
}

const ioMerge = ioLift(merge)

const ioFoo: IO<Foo> = of(foo)
const ioBar: IO<Bar> = of(bar)
const ioFooBar: IO<FooBar> = ioMerge(ioFoo, ioBar)

assertEqual(ioFooBar(), fooBar)
EN

回答 1

Stack Overflow用户

发布于 2021-01-05 23:05:39

可以通过一个Monoid实例来合并相同类型的结构(请参阅getStructMonoid),但是您希望将结构与不同的接口合并,并且没有用于该操作的类型类。但是,Object.assign等同于您的merge函数,只不过它可以合并多达四个参数(除此之外,您将在TypeScript中得到一个any )。

至于ioLift,没有什么与fp-ts中的相同之处,但是sequenceT + map的实现是将函数应用于某些参数的标准方法,而这些参数恰好被包装在某个应用函式中,即fp-ts标准,也就是说,考虑到TypeScript的局限性(请参阅@gcanti‘some 这里,关于为什么没有liftN函数)。

考虑到sequenceT + map组合是多么琐碎,人们可能会说它不符合Fairbairn阈值,这意味着每当您发现自己处于这种情况时,只将sequenceT + map内联组合起来就更容易了,而不是为遇到的每个应用程序函子编写专门的实用程序liftWhatever

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65539681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档