_ должен следовать методу - PullRequest
4 голосов
/ 14 марта 2011

Упрощенно, из более сложной программы:

scala> type T = (String) => String
defined type alias T

scala> def f(s: String) = s + " (parsed)" 
f: (s: String)java.lang.String

scala> f _
res0: (String) => java.lang.String = <function1>

scala> def g(func: T) = func _    
<console>:6: error: _ must follow method; cannot follow (String) => String
       def g(func: T) = func _
                    ^

Я не очень понимаю, почему это не работает. В чем разница между методом и чем-то в форме (Type1, Type2 ...) => Type и как правильно получить частичную функцию из чего-то подобного?

Ответы [ 4 ]

8 голосов
/ 15 марта 2011

В Scala есть разница между методами и функциями. Методы всегда принадлежат объекту, но функции являются объектами. Метод m может быть преобразован в функцию с помощью m _

См. Разница между методом и функцией в Scala

6 голосов
/ 15 марта 2011
scala> def g(func: String => String) = func(_)
g: (func: (String) => String)(String) => String

Скобки имеют все значение.Это одна из хитрых вещей в связывании _;его можно использовать для поднятия метода до замыкания, и его можно использовать для частичного применения, но эти два использования не совпадают!

4 голосов
/ 15 марта 2011

это то, что вы пытаетесь сделать?

scala> def g(func: T) = func
g: (func: (String) => String)(String) => String

scala> g(f)("test")
res8: String = test (parsed)
3 голосов
/ 14 марта 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...