问题标签 [fp-ts]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1010 浏览

typescript - 如何在 fp-ts 中使用管道删除 if 语句

我第一次看pipeOption进去fp-ts

我有这段代码,它的类型很窄,但我确信它可以在没有if语句的情况下完成:

0 投票
2 回答
350 浏览

typescript - 使用 fp-ts sequenceT 时如何“加宽”阅读器类型?

我想知道在使用 sequenceT 时是否可以“扩大”我的终极阅读器类型?这在使用 chainW 等按顺序链接操作时是可能的,但看起来在使用 sequenceT 时,您会遇到每个项目都必须使用相同的 Reader 类型。我想这样做,这样我就可以在适当的地方并行执行一些任务,但仍然可以通过 Reader 使用依赖注入。

例子:

这可以很好地编译并输出:

现在假设 getDad 依赖于不同的 api,比如 api3。如果我更新它不再编译的代码,因为 getMum 和 getDad 没有使用相同的 Reader 类型。

示例(不编译):

我实际上是在用 StateReaderTaskEither 尝试这个,但在这个例子中简化了它以使用 ReaderTask - 然而,sequenceT 也表现出相同的限制。

任何想法如何解决?

0 投票
2 回答
460 浏览

typescript - 从 fp-ts 中的项目数组中删除选项

假设我有以下类型:

以及以下错误处理助手:

然后我创建一个像这样的函数:

这一切都编译得很好,但我真正想要的是返回一个没有过滤掉的数组,如果没有则引发适当的错误!

天真的方法是将 Right 路径的返回更改为:

但这不会编译,抛出以下错误:

如何应用这种过滤?

0 投票
1 回答
214 浏览

typescript - 将 Task[Either] 和 IO[Either] 表示为包含 tryCatch 的单个 monad?

有没有办法将 IOEither 和 TaskEither 表示为一个也包括tryCatch?

我目前将通过 HTTP 使用 API,因此使用 TaskEither 是有意义的,但预计此代码将“离家更近”迁移,并且在那时将其设为有意义IOEither。所以我想写一个无标签风格的消费者界面

到目前为止,一切都很好!然而,虽然有一个tryCatchfor Option、Either、TaskEither、IOEither 等,但我可以说它不是任何接口的一部分。所以我正在尝试创建自己的:

这里的问题IOError是同步,所以f:Lazy<A>很好,TaskEither是异步的,所以它需要f:Lazy<Promise<A>>改为。

有没有更好的方法来解决这个问题,或者这是不可能的?我是否需要始终使用 TaskEither,然后添加一个将 IOEither 转换为 TaskEither 并放弃无标记决赛的步骤?

0 投票
2 回答
146 浏览

functional-programming - 从两个谓词中生成一个谓词(幺半群的工作,折叠?)

我有两个谓词

组合两个谓词以创建新谓词的功能方式是什么(为简单起见,我们假设它是a => isFoo(a) && isBar(a)?

使用fp-ts,我最初认为我可以fold(monoidAll)([isFoo, isBar]),但fold希望数组是布尔值,而不是评估为布尔值的函数。

这有效

但是男孩,你好是令人费解的。我以为可能有另一种方式。我最终编写了自己的幺半群,它接受两个谓词并将它们组合起来,称之为monoidPredicateAll

是否有一种结合两个谓词的规范 FP 方式?我知道我可以做类似的事情

但是它可能会因为更多的谓词而变得复杂,并且重新使用一个幺半群使得我不太可能像isFoo(x) || isBar(x) && isBaz(x)我的意思一样做错字&&(这就是 axs.filter(fold(monoidPredicateAll)(isFoo,isBar,isBaz))会有所帮助的地方。

我在 SO 上找到了关于这个的讨论,但它是关于 Java 和内置Predicate类型的,所以没有直接解决我的问题。

是的,我想太多了:)

0 投票
0 回答
96 浏览

typescript - 左/右任务的分区列表

假设我有三个实体,一个父实体,代表通过第三方 API 摄取数组数组,一个子实体代表一个此类数组成员的解析和处理,错误代表处理失败以及错误消息。

假设我有以下类型:

然后是以下功能:

完整代码在这里:https ://stackblitz.com/edit/typescript-3qv4t1?file=index-bad.ts

只要我在里面有验证规则markParentFailedmarkParentMapped确定父级确实(或没有)附加了子级/错误,这段代码就可以工作。

相反,我想要实现的是让 cross 的初始映射lookupDetails返回hydratedParent.authors一个 Either,这样我就可以根据故障的存在完全划分流。实际上,像这样:

这无法编译。

此外,我的理解是,即使我让它编译,TaskEither 无论如何都会忽略左分支,并且实际上将它作为异常抛出。

以这种方式对 TaskEither 进行分区的 fp-ts 咒语是什么?

0 投票
2 回答
432 浏览

typescript - 嵌套数据获取 fp-ts 末日金字塔

首先使用 fp-ts 库进入 typescript 函数式编程的世界。

我在这里有一个埃及人会引以为豪的“末日金字塔”,我的方法显然做错了。我应该采取什么方法以一种不太命令的方式解决我的嵌套数据获取问题?

金字塔

片段中使用的函数

简化数据模型

0 投票
2 回答
124 浏览

typescript - 如何使用扩展运算符调用重载函数

我想使用扩展运算符从 fp-ts 调用管道函数,但它没有重载。

相反,我不得不强制pipe转换为任何,这看起来很丑陋并且会损害可读性。

我可以扩充现有类型吗?

我创建了这个简单的示例,这里是一个代码框。现实世界的例子让我无法确切知道我将传递多少个参数给管​​道。

0 投票
1 回答
375 浏览

typescript - Typescript:将函数输入类型与 Array.reduce 函数中的输出类型匹配

尝试通过 Array.reduce 函数生成对象时遇到问题。此代码将在 javascript 中正常工作。但是在打字稿中,我无法匹配 reduce 函数中的类型,它会引发如下所示的错误。

这是一个小例子,在我的例子中,有更多的输入类型和 2-3 级处理,比如下面的buildSchema函数。我宁愿通过 reduce 函数来生成它们,而不是像下面的morph对象那样手动列出它们。

知道如何通过类型系统解决这个问题吗?根据输入推断类型。所以我仍然可以拥有类型安全,但不必为不同的输入键一遍又一遍地复制粘贴相同的代码?

示例代码:

错误:

输入'((str1: string, str2: string) => AlphaSchema) | ((str1:字符串,str2:字符串)=> BetaSchema)| ((str1: string, str2: string) => GammaSchema)' 不能分配给类型 '((str1: string, str2: string) => AlphaSchema) & ((str1: string, str2: string) => BetaSchema) & ((str1: string, str2: string) => GammaSchema)'

类型'(str1: string, str2: string) => AlphaSchema' 不可分配给类型 '((str1: string, str2: string) => AlphaSchema) & ((str1: string, str2: string) => BetaSchema) & ((str1: string, str2: string) => GammaSchema)'

类型'(str1: string, str2: string) => AlphaSchema' 不可分配给类型 '(str1: string, str2: string) => BetaSchema'

“AlphaSchema”类型缺少“BetaSchema”类型的以下属性:boss

我正在使用打字稿 4.1.3

0 投票
1 回答
474 浏览

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

使用 FP-TS 时,我经常会发现结构体位于 aTaskIO. 我设法通过编写一个合并函数和单独的提升函数来解决这个问题,使其与Taskor一起使用IO。有关更详细的说明,请参阅包含的代码示例。该代码有效,但我想知道我编写的自定义函数是否已经以某种形式或形式在 FP-TS 中可用。