2012-04-11 6 views
0

をI持っているのScala-IDEに次のコード:スカラ - 機能パッシング - 型混乱

type myF =() => Boolean 

def acceptFunction(f: myF) { 
    //... 
} 

、その後:

var a = false 

def isA =() => a 

が、私はacceptFunctionに、それを渡ししようとすると、それはエラーになります:

acceptFunction(isA) 

エラーは次のとおりです。

type mismatch; found :() => Boolean required: Boolean

しかし、なぜですか?

私はこのようなisA宣言する場合:

def isA() =() => a 

それが受け入れられたのが、私は仮定し、それはのために括弧の評価をを取得します。

このような関数をより精度の高い評価に渡す方法はありますか?

UPDATE:

それはScalaの-IDEで何かあるように見えます。 REPLはこれらの式に問題はありません。しかし、それでも、渡された関数がクロージャに変換されないようにすることはできません。つまり、それはクロージャに変わり、後でvar aを変更し、println(f())で再度この例を呼び出すと、値は変更されません。だから、問題の第二の部分は残っています - より良い評価のためにそのような関数を渡す方法はありますか?

+0

あなたのアップデートに応じて、より多くの質問で私の回答が更新されました。 –

+0

Scala IDEではうまく動作します。あなたのコードを 'object'の中にラップしました。 –

+0

'acceptFunction(isA())'のように、コールサイトで空の括弧を追加するとエラーになりますが、関数の適用時に 'Boolean '。 –

答えて

1

初めてコードを書くときに間違いを犯さなかったことはありますか?私はあなたが持っていたものをコピーして2.9.1 REPLに貼り付けました。

scala> type myF =() => Boolean 
defined type alias myF 

scala> var a = false 
a: Boolean = false 

scala> def isA =() => a 
isA:() => Boolean 

scala> def acceptFunction(f: myF) {println(f())} 
acceptFunction: (f:() => Boolean)Unit 

scala> acceptFunction(isA) 
false 

scala> 

UPDATE:isAあなたはそれを定義するクロージャです。それをacceptFunctionに渡すことは、それがつかむかどうかには影響しません。a

関数を記述する目的は、acceptFunctionです。fは、外部値であるaを定義した時点でそれをキャプチャしますか?

// Defines a function which returns a function with returns the 
// value that was captured at the outer function's call time. 
def isB = { (b: Boolean) => {() => b }: myF } 

a = true 

val f = isB(a) 

acceptFunction(f) // >> true 

a = false 

acceptFunction(f) // >> true 

はどこに行くことにしようとしているということです:

あなたはそうのようなことができますか?

+0

同じですが、私は同じ答えを書いていました。 –

+0

Scalaバージョン2.9.1-1(Java HotSpot(TM)64ビットサーバーVM、Java 1.6.0_31)と同じです。 – Jan

+0

Hmmm、strange。 Scala-IDEのようなものです。これは初めてではないようです。はい、REPLでも私のために働いていました。しかし、常にクロージャを生成するので、varを後で変更することは、渡された関数に影響を与えません。質問の更新を参照してください。 – noncom