问题标签 [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.
typescript - fp-ts/typescript 避免嵌套管道
在打字稿中使用 fp-ts 时如何避免嵌套管道?做记号?这是我要避免的嵌套管道示例
typescript - 当第二个函数返回第一个函数的值和第一个函数的参数时,两个函数的无点组合
假设我正在编写一个函数来进行 HTTP 调用以获取数据。我已将 API 调用分解为我编写的更小的函数:
使用flow
我已经设法最小化定义输入参数的频率。它只是一个地方,在buildPayload
,我没有任何隐含的any
论点)。如果出现新需求,这使得更改参数变得容易:更新一个地方,更改会在其余代码中级联。我认为这被称为“无点编程”。
当每一步都依赖于前一步而不依赖于其他步骤时,这很容易。但是假设流程中const foo = (a:A)=>B
的第一步是,第二步是const bar = (a:A,b:B)=>C
这样,第一步取决于第一步的结果,但也需要与第一步相同的参数。
我怎样才能做到这一点并且仍然是免费的(假设我正确使用了该术语)?
flow(foo, bar)
不起作用,因为 thenbar
需要接受的返回值foo
作为其参数。
我可以将它们定义为foo = (a:A) => ...
然后bar = (a:A, b:B) => ...
但现在我必须(inputs:A)
在三个地方定义:foo
、bar
和apiCall
. 如果我更改参数,我必须更新三个不同的函数参数列表。
typescript - 两个功能“组合”(非组合)的无点样式
我在 TypeScript 中执行此操作,但可以使用具有 FP 能力的另一种语言进行响应。
说我有const foo = (a:A) => M
和const bar = (b:B) => N
。我想“并行”运行这些函数(不必是实际的并行 IO,但它们不相互依赖),而是通过以无点方式定义“组合”。
如果它们实际上是可组合的(比如a
返回B
而不是M
),我可以写
相反,我想要某种方式将它们组合起来(让我们称之为 this magicCompose
),这样我的无点风格就会产生
这是一种可能吗?
fp-ts
在 TypeScript 中使用,我sequenceT
可以将它们视为读者并像这样组合它们
但是,如果使用不同的参数,这是无效foo
的bar
。我可以使用local: (E => R) => (Reader<E, any>) => Reader<R, any>
,但是我必须断点来写
这是有效({a:A,b:B}) => [M,N]
的,但不幸的是它不是无点的。如果我要制造像_a = Lens.fromProp<{a:A,b:B}>()('a')
然后_b = Lens.fromProp<{a:A,b:B}>()('b')
有
但这似乎是为了获得免费积分而作弊。
typescript - 在 TaskEithers 数组中获取第一个成功的值
我对函数式编程比较陌生,对fp-ts也很陌生,所以我很难理解提供的 util 函数。我目前正在尝试弄清楚如何将TaskEither
s 作为数组中的后备处理。
我有一个函数来获取一些数据id
,它返回Error
或Success
:
我想要的是一个函数,它将遍历一些id
s 数组(例如[1, 2, 3, 4]
),为每个数组请求数据。TaskEither
它应该在成功并返回的第一个停止Right<Success>
。如果所有的TaskEither
s 都失败了,它应该将它们的错误收集到一个Left<Error[]>
.
我尝试了类似的方法,但有一些明显的问题(如下所述):
这种方法的问题
- 它
getData
在所有 ID 上运行,第一次成功时不会短路 - 如果有任何
getData
s 错误,它就会出错。所以如果有错误,即使成功getData(4)
了总体也会出错program
getData(1)
- 它不会将错误收集到一个数组中
Error[]
typescript - 如何在服务器上使用 fp-ts 验证用户?
我是函数式编程的新手,所以很多事情对我来说仍然不清楚。我正在尝试使用 fp-ts 编写我的 graphql 服务器,但我遇到了用户授权问题。我期待这样的授权:验证用户数据->检查他是否存在->加密他的密码->创建用户。所以这在类型中看起来像: Either<string, data> -> TaskEither<string, User> -> Either<string, data> -> TaskEither<string, User> 我不知道真正的谁正确链接它而不会出现类型错误,并且如果已经获得 Left(string),则可以忽略管道中的项目。
这是我的数据库代码:
这是我的验证码:
typescript - 具有未知键的属性的 Io-ts 接口
我正在尝试创建以下的 io-ts 接口
我的界面.ts
我想把它变成 io-ts 等价物。最终目标是将其与另一个现有的 io-ts 接口结合起来
我的其他interface.ts
我的想法是我需要一个类型来表示一个有效负载,该有效负载将包含一些我们需要且必须有效的字段,以及一些我们不知道且可以是可选的字段。我们希望将这些组合起来,以便稍后在处理中使用,最终存储在 dynamodb 中
fp-ts - fp-ts 从 Either[] 序列中返回所有左值
我有一个字符串列表,string[]
我映射了一个返回的验证函数Either<Error, string>[]
我想要[Error[], string[]]
,所有验证错误和所有验证字符串。
可以sequence(Either.Applicative)
或traverse(Either.Applicative)
返回所有遇到的错误吗?我只收到了Either<Error, string[]>
,只是返回了第一个错误。我是否需要编写我自己的 Applicative,一个包含左右合并的 Semigroup 的东西?
我可以通过更改map
为.reduce
fold
我还想过反转验证,然后运行两次。一个函数返回有效字符串,一个函数返回错误。
fp-ts - fp-ts:过滤掉某些左边的值,右边的错误
我想忽略使用 fp-ts 的某些错误(如果它们发生,则表示一切顺利,即在注册过程中缺少帐户)。
我有以下代码:
该lookupAccountByEmail
函数将返回一个帐户,或者将返回一个错误对象。如果返回一个帐户,我需要返回一个带有代码“帐户存在”的错误。如果返回代码为“account-not-found”的错误对象,我希望一切都继续进行,就好像没有问题一样。如果返回带有任何其他代码的错误对象,它应该仍然是错误的。
在 fp-ts 中处理这个问题的最佳方法是什么?
typescript - TypeScript 通用运行时类型检查
运行时数据是否可以指定运行时类型检查的类型?希望使用 io-ts?
一个switch
语句创建多个位置来添加新类型。查找对象属性,例如types[runtime.type]
创建编译时类型检查错误。值可能是未定义的。
运行时数据:
类型:
检查类型后,我还想在通用实现中使用数据:
fp-ts - 添加两个包裹在 Option Monad 中的值
如果我有两个包含数字的 Option monad,如何在不退出 monad 的情况下将它们相加?
谢谢 :-)