[Functional Programming] 2. Function modelling -- Validation
We want to write a Monoid, which able to take function called 'run', therefore we able to run a serial of functions together to get a combined result.
Prototype:
/** * Take a `run` function, return a object which contain `run & concat` * methods. * * concat take other Monoid. we able to concat the reuslt inside concat function. * @param {run: function} */ const Fn = run => ({ run, concat(otherM) { return Fn(x => run(x).concat(otherM.run(x))); } });
Example:
const { List } = require("immutable-ext"); const Success = x => ({ x, isFail: false, concat(otherM) { return otherM.isFail ? otherM : Success(x); } }); const Fail = x => ({ x, isFail: true, concat(otherM) { return otherM.isFail ? Fail(x.concat(otherM.x)) : Fail(x); } }); const Validation = run => ({ run, concat(otherM) { return Validation((key, x) => run(key, x).concat(otherM.run(key, x))); } }); ///////////////// const isPresent = Validation((key, x) => !!x ? Success(x) : Fail([`${key} is required`]) ); const isEmail = Validation((key, x) => /@/.test(x) ? Success(x) : Fail([`${key} is not a valid email`]) ); const validate = (schema, obj) => List(Object.keys(schema)).foldMap( key => schema[key].run(key, obj[key]), Success(obj) ); //////////////////// const validationSchema = { name: isPresent, email: isPresent.concat(isEmail) }; const obj = { name: "Zhentian", email: "wan@wan.one" }; const res = validate(validationSchema, obj); console.log(res);
'Validtion' is the monid we create which enable to run a serial of validation functions such as 'isPresent' & 'isEmail'.
Output result is if 'Success': then return the object itself.
If 'Fail': Then return all the error message.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2019-03-10 [Algorithm] Print All Subsets of a Set
2019-03-10 [Functional Programming] mapReduce over Async operations and fanout results in Pair(rejected, resolved) (fanout, flip, mapReduce)
2019-03-10 [Functional Programming] mapReduce over Async operations with first success prediction (fromNode, alt, mapReduce, maybeToAsync)
2017-03-10 [Angular] Export directive functionalities by using 'exportAs'
2017-03-10 [Postgres] Group and Aggregate Data in Postgres
2017-03-10 [Ramda] Create a Query String from an Object using Ramda's toPairs function
2017-03-10 [Ramda] Filter an Array Based on Multiple Predicates with Ramda's allPass Function