按名称引用scala函数?

时间:2015-06-15 13:43:08

标签: scala

这是另一个关于Scala中作为第一类对象的函数的愚蠢scala问题。如果这是一个重复,我很抱歉,因为它可能是。

在Python,Lisp,Perl,Scheme等等我习惯于创建函数值并为它们分配名称并将它们传递给其他函数,如python中所示:

>>> def yyy(c):
...     return c.upper()
... 
>>> yyy
<function yyy at 0x1032965f0>
>>> yyy('a')
'A'
>>> def compose(f,g):
...     def composition(x):
...         return f(g(x))
...     return composition
... 
>>> compose(ord, yyy)('a')
65

在scala中我不知道如何做到这一点,因为scala总是希望评估函数,据我所知。你怎么称呼 scala中未评估的函数并将其传递,将其保存在数据中 结构,等等?

例如,我不能这样做,显然:

scala> def yyy(c: Char) = {
     |     c.toUpper
     | }
    yyy: (c: Char)Char

scala> yyy('a')
res5: Char = A

scala> yyy
<console>:9: error: missing arguments for method yyy;
follow this method with `_' if you want to treat it as a partially
applied function
          yyy
          ^

scala> yyy_
<console>:8: error: not found: value yyy_
          yyy_
          ^

正如你所看到的,我尝试了并且未能理解“_”提示。有线索吗?如何在不评估函数的情况下引用函数?

1 个答案:

答案 0 :(得分:4)

yyy不是函数,它是一种方法。您必须使用η-expansion

将其转换为函数
yyy _

或首先使用功能

val yyy = (c: Char) => c.toUpper
// or
val yyy: Char => Char = c => c.toUpper
// or
val yyy: Char => Char = _.toUpper