是否可以定义中缀函数?

Mar*_*ova 11 javascript functional-programming infix-operator coffeescript

是否可以在CoffeeScript(或纯JavaScript)中定义自己的中缀函数/运算符?我想打电话

a foo b
Run Code Online (Sandbox Code Playgroud)

要么

a `foo` b
Run Code Online (Sandbox Code Playgroud)

代替

a.foo b
Run Code Online (Sandbox Code Playgroud)

或者,当foo是全局函数时,

foo a, b
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

okd*_*wit 19

ES6支持非常Haskell/Lambda演算的方式.

给定乘法函数:

const multiply = a => b => (a * b)
Run Code Online (Sandbox Code Playgroud)

您可以使用部分应用程序定义加倍函数(省略一个参数):

const double = multiply (2)
Run Code Online (Sandbox Code Playgroud)

你可以自己组合双重功能,创建一个四重功能:

const compose = (f, g) => x => f(g(x))
const quadruple = compose (double, double)
Run Code Online (Sandbox Code Playgroud)

但实际上,如果你更喜欢中缀符号怎么办?正如Steve Ladavich指出的那样,你需要扩展原型.

但我认为使用数组符号而不是点符号可以做得更优雅.

让我们使用函数组成"∘"的官方符号:

Function.prototype['?'] = function(f){
  return x => this(f(x))
}

const multiply = a => b => (a * b)
const double = multiply (2)
const doublethreetimes = (double) ['?'] (double) ['?'] (double)

console.log(doublethreetimes(3));
Run Code Online (Sandbox Code Playgroud)

  • Javascript最终有一个合成运算符:`['∘']`.这是一个很棒的黑客!+1 (2认同)

Gij*_*ijs 5

实际上将其作为答案:,这是不可能的。

在Vanilla JS中是不可能的

在CoffeeScript中是不可能的