我有两个函数,它们根据if语句执行。 E.g:
if(value) {
doA()
} else {
doB()
}
如何编写将获取结果的函数或对象,并决定是否执行每个函数。我想收到这样的话:
exists(result).doA()
nothing(result).doB()
我想在JavaScrit中学习一些函数式编程,所以我很欣赏任何可以用JavaScript学习FP的源代码。
答案 0 :(得分:1)
延续传球风格
这是使用continuation passing style的方法。您会注意到main
的实现与原始编码相差不远 -
一旦你完成了这个问题,如果你还没有了解monads,你现在知道最好的一个(cont
)^ _ ^
// cont :: a -> (a -> b) -> b
const cont = x =>
k => k (x)
// when :: (a -> boolean, a -> b, a -> b) -> a -> (a -> b) -> b
const when = (f,l,r) => x =>
f (x) ? cont (l (x)) : cont (r (x))
// isOdd :: number -> boolean
const isOdd = x =>
x & 1 === 1
// doA :: number -> number
const doA = x =>
x + 1
// doB :: number -> number
const doB = x =>
x * x
// main :: number -> void
const main = x =>
cont (x) (when (isOdd, doA, doB)) (console.log)
main (3) // IO: 4, doA (3) === 3 + 1
main (4) // IO: 16, doB (4) === 4 * 4
数据构建器
这是使用简单数据构造函数Left
和Right
来表示Fork sum type的另一种方法 - 这会产生一种data-directed样式,其中{{1}的控件由输入类型
main
答案 1 :(得分:0)
你可以写这样的东西,例如:
function exists(value) {
return function (func) {
if (value !== undefined) {
return func(value);
}
return null;
}
}
function nothing(value) {
return function (func) {
if (value === undefined) {
return func();
}
return null;
}
}
function doA(value) {
console.log('doing A', value);
}
function doB() {
console.log('doing B');
}
const foo = 'fool';
const bar = undefined;
exists(foo)(doA);
nothing(bar)(doB);
exists 函数获取一个值并返回另一个函数。返回的函数获取另一个函数作为参数,执行如果定义了传递的值。
我在上面的示例中使用了“老派”匿名函数,以便更容易理解。使用ES6箭头功能,您可以更加巧妙地编写 exists 和 nothing 功能,如下所示:
function exists(value) {
return func => value !== undefined ? func(value) : null;
}
function nothing(value) {
return func => value === undefined ? func(value) : null;
}
当您意识到可以通过将公共代码放在另一个函数中来重构这两个函数时,“函数编程乐趣”真正开始,然后用于创建两个函数,如下所示:
function executeWithCondition(predicate) {
return value => func => predicate(value) ? func(value) : null;
}
const exists = executeWithCondition(value => value !== undefined);
const nothing = executeWithCondition(value => value === undefined);
此技术称为 currying 。
这些功能的用法仍然相同:
exists(foo)(doA);
nothing(bar)(doB);
这是完整的可运行代码示例:
function executeWithCondition(predicate) {
return value => func => predicate(value) ? func(value) : null;
}
const exists = executeWithCondition(value => value !== undefined);
const nothing = executeWithCondition(value => value === undefined);
function doA(value) {
console.log('doing A', value);
}
function doB() {
console.log('doing B');
}
const foo = 'fool';
const bar = undefined;
exists(foo)(doA);
nothing(bar)(doB);

答案 2 :(得分:0)
一种方法是定义具有设置为函数
的值的对象的属性
const o = {
exists: function(value) {
return value ? this.doA() : this.doB()
},
doA: function(value) {
console.log("A")
},
doB: function(value) {
console.log("B")
}
}
o.exists(void 0);