【发布时间】:2014-10-13 14:44:57
【问题描述】:
我想将a.meth(b) 之类的表达式转换为执行该精确计算的(A, B) => C 类型的函数。
到目前为止,我最好的尝试是沿着这些思路:
def polish[A, B, C](symb: String): (A, B) => C = { (a, b) =>
// reflectively check if "symb" is a method defined on a
// if so, reflectively call symb, passing b
}
然后像这样使用它:
def flip[A, B, C](f : (A, B) => C): (B, A) => C = {(b, a) => f(a,b)}
val op = flip(polish("::"))
def reverse[A](l: List[A]): List[A] = l reduceLeft op
正如您所见,它非常丑陋,您必须“手动”进行大量类型检查。
还有其他选择吗?
【问题讨论】:
-
我不太明白如何使用
polish方法。你能展示一个示例用例吗? -
但
symb是定义为值 -
我真的明白了。类似
polish("charAt")("quux", 2)。 -
我会这样使用它:l.foldLeft(Nil)(polish("::"))
-
@IonuțG.Stan 是的,它会避免使用经典的:.meth(),这会导致这些函数无法重用。
标签: scala functional-programming polish-notation