Typescript 如何从ReaderEither出发<;R、 E,A>;[]致ReaderEither<;R、 E[],A[]和gt;在fp ts中?
在fp ts中,如何从Typescript 如何从ReaderEither出发<;R、 E,A>;[]致ReaderEither<;R、 E[],A[]和gt;在fp ts中?,typescript,functional-programming,fp-ts,Typescript,Functional Programming,Fp Ts,在fp ts中,如何从ReaderEither[]转到ReaderEither?本质上,我想将一个ReaderEither实例数组转换为一个ReaderEither实例 我试着寻找答案,但运气不太好。我对函数式编程和fp-ts还不熟悉,所以我仍在尝试将我的头脑集中在所有的概念上,并将它们付诸实践。谢谢你的帮助。试试这个: import * as A from 'fp-ts/Array' import {left, right} from 'fp-ts/Either' import * as R
ReaderEither[]
转到ReaderEither
?本质上,我想将一个ReaderEither
实例数组转换为一个ReaderEither
实例
我试着寻找答案,但运气不太好。我对函数式编程和fp-ts还不熟悉,所以我仍在尝试将我的头脑集中在所有的概念上,并将它们付诸实践。谢谢你的帮助。试试这个:
import * as A from 'fp-ts/Array'
import {left, right} from 'fp-ts/Either'
import * as R from 'fp-ts/Reader'
import {flow} from 'fp-ts/function'
import type {ReaderEither} from 'fp-ts/ReaderEither'
const sequenceRE: <R, E, A>(
fs: ReaderEither<R, E, A>[]
) => ReaderEither<R, E[], A[]> = flow(
// ReaderEither<R, E, A>[] -> Reader<R, Either<E, A>[]>
A.sequence(R.reader),
// Maps the reader: Reader<R, Either<E, A>[]> -> ReaderEither<R, E[], A[]>
R.map(flow(
// Either<E, A>[] -> Separated<E[], A[]>
A.separate,
// Separated<E[], A[]> -> Either<E[], A[]>
s => s.left.length ? left(s.left) : right(s.right)
))
)
// Right [4, 6]
sequenceRE([r => right(r * 2), r => right(r * 3)])(2)
// Left ['foo', 'bar']
sequenceRE([r => right(r * 2), r => left('foo'), r => left('bar')])(2)
// Right []
sequenceRE([])(2)
Left
s,则返回带有Left
值的Left
,否则返回带有Right
值的Right
我相信Traversable可能是关键。我已经找到了一些将它与Option一起使用的例子,但是我很难将它与ReaderEither一起使用。您可以使用从
ReaderEither[]
获取ReaderEither
,但我不确定如何累积错误。是否确实要使用ReaderEither
?这与读取器
相同;你想要一个阅读器吗?是的,我希望将结果累积到一个或,而不是有多个或“显示你想这样做吗?如果一些读卡器
返回左
,而另一些返回右
,该怎么办?您是否希望最终的或依赖于第一个读取器
(例如,如果第一个读取器
返回一个左
,则通过累加另一个左
来返回一个左
,并放弃右
?如果读卡器[]
是空的呢?这样做很好。非常感谢你。这几天我一直在“打转”。
interface Separated<A, B> {
readonly left: A
readonly right: B
}
// For Array:
declare const separate: <A, B>(fa: Either<A, B>[]) => Separated<A[], B[]>