繁体   English   中英

如何在fp-ts中组合Either对象的左侧?

How to combine the left sides of Either objects in fp-ts?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

对于返回Either的不同值,我有两个验证函数。 如果其中一个具有left值,我想抛出一个异常,如果两者都是right则什么也不做。 我以前从未使用过 fp-ts 并且无法弄清楚如何正确组合左侧结果。 我当前的解决方案有效,但感觉我没有正确使用它。

import { Either, left, right, isLeft, getOrElse } from 'fp-ts/lib/Either';

function validateMonth( m: Month ): Either<Error, Month> {
   return m.isInRange() ? right(m) : left(new Error('Month must be in range!'));
}

function validateYear( y: Year ): Either<Error, Year> {
   return year.isBefore(2038) ? right(y) : left(new Error('Year must be before 2038!'));
}

function throwingValidator(m: Month, y: Year): void {
 // todo: Refactor to get rid of intermediate variables,
 // combining results of validateMonth and validateYear into a type
 // of Either<Error, Unit>
 const monthResult = validateMonth( month );
 const yearResult = validateYear( year );
 const throwOnError = (e: Error) => { throw e; };
 if ( isLeft( monthResult ) ) { getOrElse(throwOnError)(monthResult); }
 if ( isLeft( yearResult ) ) { getOrElse(throwOnError)(yearResult); }
}

我已经阅读了https://dev.to/gcanti/getting-started-with-fp-ts-either-vs-validation-5eja的介绍,但该代码与我想要的完全相反:我不关心验证后的输入值,并且只想返回发生的第一个错误。

2 个回复

您可能正在寻找类似的东西

const toPromise = fold(e => Promise.reject(e), r => Promise.resolve(r));

Promise.all([
    toPromise(validateMonth(month)),
    toPromise(validateYear(year)),
]).then(([validMonth, validYear]) => {
    return …
});

或更实用的方式

toPromise(ap(ap(of(validMonth => validYear => {
    return …
}), validateMonth(month)), validateYear(year)))

您还可以使用array.sequence和之后的Promise.all执行toPromise

忽略throwingValidator和 throwing(这首先违背了使用fp-ts的目的)并且只关注这个特定的请求:

重构去掉中间变量,将 validateMonth 和 validateYear 的结果组合成一个 Either 类型

您可能正在寻找:

const monthAndYearResult: Either<
  Error,
  { month: Month, year: Year }
> = sequenceS(either)({
  month: validateMonth(month),
  year: validateYear(year)
})

“排序”通常需要Traversable的实例(在这种情况下either struct { year, month } )和Applicative的实例(在这种情况下),并且语义是将不同的独立计算聚合在一起的语义。

如果您明确想要忽略结果,通常会提供一个_ -suffix 替代方案来完成此操作,但目前在fp-ts v2 中还没有。

要获得Either<Error, void>您可以求助于:

const result = pipe(
  sequenceS(E.either)({ month: validateMonth(month), year: validateYear(year) }),
  E.map(constVoid)
)

请注意, sequenceS只是可能的选项之一,您可以使用sequenceTarray.sequence来获得类似的结果,例如:

pipe(
  sequenceT(either)([validateMonth(month), validateYear(year)]),
  E.map(constVoid)
)
1 在 TypeScript/fp-ts 中使用 Either 输入错误

我正在使用 fp-ts,我有一个 function,它返回一个 HttpError object 或一个字符串: 我想在另一个文件中调用这个 function,如下所示: 这基本上就是我在 Scala 中的做法。 (除了fold是 Either 类型的方法,而不是独立的 function - 所以 ...

2 如何在 FP 中管理 monad,特别是在 fp-ts 中

我对函数式编程和特别是fp-ts库很fp-ts 。 我的问题包括两部分: 我看到了一种将 Monads 从一种类型转换为另一种类型的模式,例如从Task到IO ,反之亦然,我们如何管理这种情况,我们应该始终保持在一个类型上,还是应该随着链的继续而改变? 如何简单地使打字稿遵循这些从一个到 ...

3 什么是 fp-ts 谓词?

我正在尝试使用 fp-ts 实现一些简单的数据验证,并遇到了这个代码框示例:import * as E from "fp-ts/lib/Either"; import { getSemigroup, NonEmptyArray } from "fp-ts/lib/NonEmptyArray"; i ...

4 使用 FP-TS 合并类型化结构

使用 FP-TS 时,我经常会在Task或IO中IO 。 我设法通过编写合并 function 和单独的提升功能来解决问题,使其与Task或IO 。 有关更详细的说明,请参阅包含的代码示例。 该代码有效,但我想知道我编写的自定义函数是否已经以某种形式或形式在 FP-TS 中可用。import { d ...

6 如何在 fp-ts 中避免带有链的厄运金字塔?

我经常遇到这种情况,我需要完成几个顺序操作。 如果每个操作都只使用上一步中的数据,那么我可以很高兴地执行诸如pipe(startingData, TE.chain(op1), TE.chain(op2), TE.chain(op3), ...) 。 当op2也需要来自startingData数据而没 ...

7 (已解决)如何在FP-TS中链接依赖的TaskEither操作

我是FP-TS的新手,但仍然不太了解如何使用TaskEither 。 我试图异步读取文件,然后使用yaml-parse-promise解析结果字符串。 ==编辑== 我使用文件的全部内容更新了代码,以提供更多上下文,并应用了MnZrK提供的一些建议。 抱歉,我对FP-TS还是陌生 ...

2019-08-01 20:55:13 1 97   fp-ts
9 FP-TS消耗的IO

此代码中forEach部分的惯用fp替代方案是什么 const ios: IO&lt;void&gt;[] = [...] ios.forEach(io =&gt; io()); ? 有一些使用Foldable sequence_文档,但在fp-ts@2.0.3中不再可用。 ...

2019-07-23 14:28:58 1 42   fp-ts
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM