我有一個關于咖喱函式的問題。我知道如果我有這個簡單的咖喱函式:
const greeting = (greet) => {
return (name) => {
return `${greet} ${name}`;
};
};
我可以打電話greeting('Hello')('John'),它會回傳Hello John。
有沒有辦法讓它在 1 個引數和 2 個引數之間靈活地說,例如:使用上面的問候功能,有沒有辦法讓我呼叫它greeting('Hello'),greeting('Hello')('John')它會分別回傳Hello和Hello John?
我知道我可以做到這一點,greeting('Hello')()但greeting('Hello')('John')我只是想避免破壞性的變化,因為我已經有一個問候方法,并希望它也接受問候('Hello')而沒有額外的 () 最后......
謝謝
uj5u.com熱心網友回復:
有辦法嗎?當然。但為什么?因為那不是“不咖喱”嗎?當然,您將不得不修改功能。
你總是可以做這樣的事情,只是得到你要求的輸出:
const greeting = (greet) => {
const split = greet.split(" ");
if(split.length > 1)
return `${split[0]} ${split[1]}`;
else return (name) => {
return `${greet} ${name}`;
};
};
uj5u.com熱心網友回復:
我只能想到一個通過將 curried 函式強制轉換為字串來作業的選項。這不會更改回傳值,但可以讓您根據背景關系獲得所需的結果。
const greeting = greet => Object.defineProperties(
name => `${greet} ${name}`, // curried
{
toString: {
value: () => greet,
},
valueOf: {
value: () => greet
}
}
)
console.log(typeof greeting("Hello")) // function, not string
console.log(`${greeting("Hello")}`) // note the string context
console.log(`${greeting("Hello")("World")}`)
但是,如果您需要回傳值在函式和字串之間進行實際切換,答案是否定的。
為了greeting("Hello")("John")回傳一個字串,greeting("Hello") 必須回傳一個函式。
無法確定greeting()如何呼叫 curried 函式,因此您無法檢測是否回傳函式或字串。
這樣想,greeting("Hello")("John")只是一個簡短的版本...
const fn = greeting("Hello")
// later or maybe never...
fn("John")
您根本不知道該 curried 函式將如何、何時甚至是否會被呼叫。
uj5u.com熱心網友回復:
如果您使用輔助函式進行柯里化,您可以自動獲得類似的行為。例如,在javascript.info/currying-partials上實作
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return function(...args2) {
return curried.apply(this, args.concat(args2));
}
}
};
}
你可以定義
const greeting = curry((greet, name) => `${greet} ${name}`)
并打電話
greeting("Hello", "John")
要么
greeting("Hello")("John")
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/429550.html
標籤:javascript
上一篇:函式遞回建議
