[Javascript Crocks] Apply a function in a Maybe context to Maybe inputs (curry & ap & liftA2)
Functions are first class in JavaScript. This means we can treat a function like any other data. This also means we can end up with a function as the wrapped value in a Maybe. The Maybe type gives us the ability to apply that wrapped function to other wrapped values, keeping both the value and the function in the safe confines of a Maybe.
The whole point is when we have params as safe params:
const safeNum1 = safe(isNumber, 1); const safeNum2 = safe(isNumber, 2);
The function we need to opreate the params is not in a Maybe context:
const add = a => b => a + b;
Now we cannot just call 'add' function to add two Just(n) value together:
add(safeNum1, safeNum2) // doesn't work
Lucky we can also wrap function into Maybe context:
const safeAdd = Maybe.of(add);
We can use 'ap' function to apply context for a function
const crocks = require('crocks') const { ap, safe, isNumber, Maybe } = crocks; const safeNum1 = safe(isNumber, 1); const safeNum2 = safe(isNumber, 2); const add = a => b => a + b; const res = Maybe.of(add) .ap(safeNum1) .ap(safeNum2); console.log(res) // Just 3
We can improve the code by using 'curry' instead of
const add = a => b => a + b;
to:
const crocks = require('crocks') const { curry } = crocks; const add = curry((a, b) => a + b);
We can also using a helper method 'liftA2' to replace calling 'ap' multiy times:
const res = Maybe.of(add) .ap(safeNum1) .ap(safeNum2);
to:
const crocks = require('crocks') const { ap, safe, isNumber, Maybe, curry, liftA2 } = crocks; const safeNum1 = safe(isNumber, 1); const safeNum2 = safe(isNumber, 2); const add = curry((a, b) => a + b); const addTwoSafeNums = liftA2(add); const res = addTwoSafeNums(safeNum1, safeNum2); console.log(res) // Just 3
【推荐】国内首个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工具
2017-05-14 [Recompose] Add Local State with Redux-like Reducers using Recompose
2017-05-14 [Recompose] Add Local State to a Functional Stateless Component using Recompose
2016-05-14 [Javascript] Advanced Console Log Arguments
2016-05-14 [Javascript] Log Levels and Semantic Methods