2015-01-28 3 views
0

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

$ scala 
Welcome to Scala version 2.9.2 (OpenJDK Server VM, Java 1.7.0_65). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> type Foo = String => Int 
defined type alias Foo 

scala> def myFoo (s : String) : Int = s match {case "a" => 123 case _ => s.length()} 
myFoo: (s: String)Int 

scala> val foo : Foo = myFoo 
foo: String => Int = <function1> 

scala> foo ("b") 
res0: Int = 1 

scala> foo ("a") 
res1: Int = 123 

Пока что так хорошо. На этом этапе я думаю, что могу определить неназванную функцию и назначить ее переменной, но, похоже, я не могу понять синтаксис. Я попробовал несколько вариантов, и никто из них не работал.

scala> val bar : Foo = (s : String) : Int = s match {case "a" => 123 case _ => s.length()} 
<console>:1: error: ';' expected but '=' found. 
     val bar : Foo = (s : String) : Int = s match {case "a" => 123 case _ => s.length()} 
             ^

scala> val bar : Foo = (s : String) => Int = s match {case "a" => 123 case _ => s.length()} 
<console>:8: error: reassignment to val 
     val bar : Foo = (s : String) => Int = s match {case "a" => 123 case _ => s.length()} 
             ^

scala> val bar : Foo = ((s : String) => Int) = s match {case "a" => 123 case _ => s.length()} 
<console>:1: error: ';' expected but '=' found. 
     val bar : Foo = ((s : String) => Int) = s match {case "a" => 123 case _ => s.length()} 
              ^

scala> val bar : Foo = (s : String) : Int => s match {case "a" => 123 case _ => s.length()} 
<console>:1: error: ';' expected but 'match' found. 
     val bar : Foo = (s : String) : Int => s match {case "a" => 123 case _ => s.length()} 
              ^

scala> 

Извините за элементарный вопрос, но может ли кто-нибудь указать правильный синтаксис?

ответ

3

val bar: String => Int = s => s match { case "a" => 123 case _ => s.length() }

или просто

val bar = (s: String) => s match { case "a" => 123 case _ => s.length() }

или еще лучше:

val bar: String => Int = { case "a" => 123 case s => s.length() }

И, чтобы взять его в другом направлении ...

val bar = { case "a" => 123 case s => s.length() }: String => Int

2

Я считаю следующее, что вы хотите:

val bar: String => Int = s => s match {case "a" => 123 case _ => s.length()} 

или более сжато:

val bar: String => Int = { case "a" => 123 case s => s.length()} 
Смежные вопросы