函数式编程是一种基于使用函数构建抽象,避免副作用和状态变化的编程范例。纯函数编程是线程安全的。
Language-Ext-我如何从验证的错误类型中获取错误消息<Error,T>
我试图仅显示在 LanguageExt 中使用 Validation 验证失败的错误消息。 但是,我得到以下字符串: ValidationData(失败, 0, [开始...
如何为反应状态构建良好的数据结构,使我能够轻松更新深度嵌套的对象数组?
我正在尝试实现一个房产(房地产)链 每个链项目应该知道哪个链项目在它上面/下面 一个链项可以有自己的子链,这又适用于它的子链...
这篇博文对如何使用 Omega monad 对角枚举任意语法进行了有趣的解释。他提供了一个示例来说明如何做到这一点,从而产生无限序列
使用管道函数时,typescript fp-ts 代码出现类型错误
我正在尝试使用 fp-ts 函数编程库编写代码并不断收到以下类型错误: TS2322:类型未知不可分配给类型 TaskEither 我尝试使用 fp-ts 函数编程库编写代码,但不断收到以下类型错误: TS2322:类型未知不可分配给类型 TaskEither 任务要么。 d. ts(1340, 42):期望的类型来自该签名的返回类型。 问题是什么,因为我不确定错误告诉我问题是什么? 如何修复此错误? 任何帮助将不胜感激。 下面代码中突出显示的部分似乎是错误的来源: const findByUserAndGroup = groupMemberRepository.findByUserAndGroup(cancelGroupMembershipDTO.groupId); pipe( sequenceS(ApplyPar)({ user: findByUserAndGroup(cancelGroupMembershipDTO.userId), userToCancel: findByUserAndGroup(cancelGroupMembershipDTO.userToCancelId) }), chain(({ user, userToCancel }) => **pipe( user, isGroupOwner, fromEither, map(() => userToCancel) )** ), map((userToCancel) => ({ groupMemberId: userToCancel.groupMemberId, groupId: userToCancel.groupId, userId: userToCancel.userId, isGroupOwner: userToCancel.isGroupOwner })), chain((processedDetails) => userRepo.delete(processedDetails)) ) 按用户和组查找: const findByUserAndGroup = (groupMemberId: string) => (userId: string): TaskEither<ErrorBase, Option<GroupMember>> => { return pipe( tryCatch( () => pool.query( `select * from groupMember where groupMemberId = ${groupMemberId} and userId = ${userId} ` ), (error: any) => ({message: `Database error: ${String(error)}`, name: 'SystemError', details: 'Database Error.', innerError: error}) ), chain(result => right(none)) ); } IsGroupOwner 验证函数: export const isGroupOwner = (groupMember: GroupMember): TaskEither<ErrorBase, GroupMember> => { if (!groupMember.isGroupOwner) { return left({message: `You do not have the permissions necessary to perform this operation.`)}); } return right(groupMember); } 错误消息 Typeknown is not allocate to type TaskEither<ErrorBase, unknown> 表明 TypeScript 期望特定的返回类型 (TaskEither<ErrorBase, unknown>),但它却接收到未知的类型。 代码中的罪魁祸首很可能是由于 findByUserAndGroup 返回的 Option 类型造成的。当您从 findByUserAndGroup 返回包装在 TaskEither 中的 Option 时,它与您正在使用的功能链中的预期类型不直接匹配。当类型通过管道和链传递时,这种差异会导致问题。 要解决此问题,您需要正确处理 Option 类型,将其转换为 TaskEither。以下是调整代码的方法: 正确处理选项类型:当findByUserAndGroup返回选项时,您应该将其映射到管道内的Either。如果Option为None,则返回错误(使用fp-ts中的left);否则,继续使用 Some 值。 重构管道:您应该确保isGroupOwner接收到GroupMember并且所有返回的类型都对齐为TaskEither<ErrorBase, GroupMember>。 修改 isGroupOwner 用法:使用 fromOption 将 Option<GroupMember> 转换为管道内的 Either。这将确保您在整个过程中获得一致的输入。 import { TaskEither, chain, map, left, right, fromEither } from 'fp-ts/TaskEither'; import { Option, fold as foldOption, some, none } from 'fp-ts/Option'; import { pipe } from 'fp-ts/function'; import { sequenceS } from 'fp-ts/Apply'; import { ApplyPar } from 'fp-ts/TaskEither'; import { fromOption } from 'fp-ts/Either'; import { ErrorBase } from './types'; // Assuming you have this type defined elsewhere // Adjusted `findByUserAndGroup` function to match the expected types const findByUserAndGroup = (groupMemberId: string) => (userId: string): TaskEither<ErrorBase, GroupMember> => { return pipe( tryCatch( () => pool.query( `select * from groupMember where groupMemberId = ${groupMemberId} and userId = ${userId} ` ), (error: any) => ({ message: `Database error: ${String(error)}`, name: 'SystemError', details: 'Database Error.', innerError: error }) ), chain(result => { // Assuming your query result parsing here to Option const groupMemberOption = some(result.rows[0]); // Replace with actual parsing logic return fromOption(() => ({ message: "Group member not found", name: "NotFoundError" }))(groupMemberOption); }) ); }; // The `isGroupOwner` function remains the same export const isGroupOwner = (groupMember: GroupMember): TaskEither<ErrorBase, GroupMember> => { if (!groupMember.isGroupOwner) { return left({ message: `You do not have the permissions necessary to perform this operation.` }); } return right(groupMember); }; // Main pipe function const result = pipe( sequenceS(ApplyPar)({ user: findByUserAndGroup(cancelGroupMembershipDTO.groupId)(cancelGroupMembershipDTO.userId), userToCancel: findByUserAndGroup(cancelGroupMembershipDTO.groupId)(cancelGroupMembershipDTO.userToCancelId) }), chain(({ user, userToCancel }) => pipe( user, fromEither(() => ({ message: 'User not found', name: 'NotFoundError' })), // Convert `Option` to `Either` chain(isGroupOwner), // Now `isGroupOwner` will work on `GroupMember` map(() => userToCancel) ) ), map((userToCancel) => ({ groupMemberId: userToCancel.groupMemberId, groupId: userToCancel.groupId, userId: userToCancel.userId, isGroupOwner: userToCancel.isGroupOwner })), chain((processedDetails) => userRepo.delete(processedDetails)) );
我读了很多关于map、reduce和filter的文章,因为它们在react和FP中的使用量很大。如果我们写这样的东西: 让 myArr = [1,2,3,4,5,6,7,8,9] 让
在 Scala 中,视图允许防止创建全新的集合。 例如在Scala中,“视图”有什么作用? JavaScript中有类似的东西吗? 我的用例: x = inputValue.split(","...
我正在学习递归模式,但我无法弄清楚未来态和组织态的用处。 我发现的几个 Scala 示例看起来非常没有说服力。我还找到了 Haskell 的例子,...
我很难弄清楚我的 Idris2 类型或编译错误是关于什么的,所以我想我可以请一些 Idris2 退伍军人或爱好者给我一些解释,告诉我如何使我的方法......
Bird-Meertens 可以用来计算 Haskell 中最长有效括号问题的线性时间解吗?
问题:给定仅由 ( 和 ) 字符组成的字符串,计算括号中最长匹配/有效子字符串的长度。 这是一个天真的解决方案: isValid :: 字符串 -> 布尔值 是Val...
Bartosz Milewski,在第 5 章的“终端对象”部分中强调了以下内容 请注意,在此示例中,唯一性条件至关重要,因为还有其他集合(实际上,所有
Clojure 替代 Haskell 的 ADT 和模式匹配?
每当在 Haskell 中我们需要一些变体数据类型时,我们都会将 ADT 与模式匹配结合使用。 Clojure 人们在此类用例中使用什么?
鉴于 ((forall b.[b]) -> Bool) 比 ((forall a.a) -> Bool) 更具多态性,为什么这段代码在 Haskell 中不进行类型检查?
我正在 Haskell 中使用更高级别的类型,并基于 Peyton Jones 的任意级别类型的实用类型推断),我希望以下函数能够进行类型检查,因为 ((forall b.[b]) 。 ..
`F a = (a -> p) -> q` 是一个应用函子吗?
形式为 F a = (a -> p) -> q 的类型构造函数在 a 中是协变的(其中我们假设 p 和 q 是固定类型,只有 a 变化)。所以,F 是一个函子。 F 是一个应用函子吗,假设 t...
我正在学习 OCaml,但在函数式编程方面遇到了一些麻烦...... 我需要创建一个函数来替换给定整数列表的 a ,即字符串索引处的字符。 S...
导入Lean1.Basic 结构 ArrayN (n : Nat) (α : Type) 其中 array : { array : 数组 α // array.size = n } 类哈希(HashType:类型)其中 哈希大小:Nat 哈希:x -> ArrayN (hashSize) ...
使用“let”进行赋值是否不违反 Clojure 中函数式编程的思想
函数式编程中应该避免赋值,但在 clojure 中我们经常使用 let。 let 只是一种实用的方式还是赋值与使用 let 不同?我们是否应该避免分配任务...
如何使用 Monad 的 (->) 实例以及关于 (->) 的困惑
在不同的问题上,我在评论中找到了有关使用 Monad 的 (->) 实例的提示,例如实现无点风格。 对于我来说,这有点太抽象了。好的,我看到了箭头
我正在编写一个 API,它具有可更新单个项目和多个项目的端点。在更新多个项目的端点中,我想重用该函数通过简单的循环来更新单个项目...
在 Haskell 中似乎无法正确排列(缩进)此代码。 出现错误: 输入 `<-' Can anyone spot where the error is at: evalListSplitAt n stratPref stratSuff [] = retur...
所以我正在学习系统工程,我们目前正在研究不同的编程范例。 上节课我们开始玩函数式编程,我们被要求编写一个递归代码'