2016-10-31 11 views
0

は、Scalaのコードの一部です:スカラーの "(=> A-Certain-Type)"の意味は?ここ

var hof: (=> Int) => Int = {r=>r+1} 

誰もが(=> Int)の意味だものを私に説明できますか?以前は(() => Int) => Intと同じだと思いますが、そうではありません。私は、次のようにそれをテストした:私は作品の場合、hof(1)に変更した場合

scala> var hof: (=> Int) => Int = {r=>r+1} 
hof: (=> Int) => Int = <function1> 

scala> hof({()=>1}) 
<console>:13: error: type mismatch; 
found :() => Int 
required: Int 
     hof({()=>1}) 

あなたが、それは間違っている見ることができます。誰でも(=>A-Certain-Type)の意味を教えてもらえますか?

答えて

0

この(=> Int)は、名前で呼び出されたときにのみIntと評価されるコードブロックと呼ぶことができます。

code: => T nameパラメータで呼び出し

def repeat[T](code: => T)(times: Int): List[T] = { 
    (1 to times).toList.map {_ => code } 
} 

は、上記のコードスニペットを考えてみています。上記の関数内のは、Tと評価される任意の式または式のグループを受け入れることができます。コードブロックは、名前で呼び出されたときにのみ評価されます。名前で

ScalaのREPL

scala> repeat { println("hello") }(3) 
hello 
hello 
hello 
res2: List[Unit] = List((),(),()) 

scala> repeat { println("hello"); 1 }(3) 
hello 
hello 
hello 
res3: List[Int] = List(1, 1, 1) 

scala> repeat(println("foo"))(1) 
foo 
res4: List[Unit] = List(()) 

コールを使用すると、マジックがあるため、コードブロックの遅延評価のそれが呼ばれるたびに発生したループ

def loop(cond: => Boolean)(codeBlock: => Unit): Unit = { 
if (cond) { 
    codeBlock 
    loop(cond)(codeBlock) 
} else() 
} 

のような面白いものを構築することができます名前で

Scala REPL

scala>  def loop(cond: => Boolean)(codeBlock: => Unit): Unit = { 
    |  if (cond) { 
    |  codeBlock 
    |  loop(cond)(codeBlock) 
    |  } else() 
    |  } 
loop: (cond: => Boolean)(codeBlock: => Unit)Unit 

scala> var i = 0 
i: Int = 0 

scala> loop(i < 10) { println("foobar"); i += 1} 
foobar 
foobar 
foobar 
foobar 
foobar 
foobar 
foobar 
foobar 
foobar 
foobar 
関連する問題