2015-06-15 2 views
1

Вот еще один глупый вопрос 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> 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_ 
     ^

Как вы можете видеть, я попытался и не смог разобраться в «_» намек. Любые подсказки? Как вы относитесь к функции без ее оценки?

+2

вы должны добавить пробелы перед тем _ («ууу _», а не " yyy_ ") – volia17

+0

' yyy' не является функцией, это метод. Вы должны либо преобразовать его в функцию с использованием η-расширения ('yyy _'), либо использовать функцию в первую очередь (' val yyy = (c: Char) => c.toUpper'). –

+0

Возможный дубликат [Разница между методом и функцией в Scala] (http://stackoverflow.com/questions/2529184/difference-between-method-and-function-in-scala) –

ответ

4

yyy не является функцией, это метод. Вы должны либо преобразовать его в функцию с помощью п-разложения

yyy _ 

или использовать функцию в первую очередь

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

Спасибо. Таким образом, я понимаю, что одно из критических различий между методом и функцией заключается в том, что метод может быть перегружен, тогда как функция не может быть перегружена, и именно поэтому это различие необходимо. Это правильно? Таким образом, вы не можете передавать методы, потому что, если метод перегружен, неясно, какая реализация должна пройти ... –

+5

@AaronWatters Критическое отличие здесь заключается в том, что методы * принадлежат * объектам (и, таким образом, имеют доступ к ' self'/'this'), тогда как функции не принадлежат объектам и могут свободно перемещаться. – dcastro

+1

// или 'val yyy = (_: Char) .toUpper' – senia

Смежные вопросы