Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何从ReaderEither出发<;R、 E,A>;[]致ReaderEither<;R、 E[],A[]和gt;在fp ts中?_Typescript_Functional Programming_Fp Ts - Fatal编程技术网

Typescript 如何从ReaderEither出发<;R、 E,A>;[]致ReaderEither<;R、 E[],A[]和gt;在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

在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 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[]>