0

REPLのScalainDepthから次のスニペットを実行してみました。

val notNull[T]: T => Boolean = _ != null

通訳は私に次のエラーを投げました:

<console>:7: error: missing parameter type for expanded function ((x$1) => x$1.$bang$eq(null))
       val notNull[T]: T => Boolean = _ != null
                                      ^
<console>:7: error: not found: type T
       val notNull[T]: T => Boolean = _ != null
                       ^
<console>:7: error: not found: type notNull
       val notNull[T]: T => Boolean = _ != null
           ^
<console>:7: error: not found: type T
       val notNull[T]: T => Boolean = _ != null
                   ^

scala> val notNull[T](f1: T => Boolean) = _ != null
<console>:1: error: ')' expected but '=>' found.
       val notNull[T](f1: T => Boolean) = _ != null

たぶん私はここでのステ​​ートメントを理解していませんが、基本的には、Tを引数として取り、ブール値を返す関数を返すタイプTのvalnotNullを宣言するという本のステートメントではありません。`_!= nullは、引数を取り、それをnullと比較することによって関数を実行し、本質的にブール値を返しますか?

コンパイラがこれらすべてのエラーをここでスローするのはなぜですか?

4

1 に答える 1

3

動作する必要がありますdef。ヴァルはそのように一般的に型付けすることはできません。これはおそらく、その val が Function1 のインスタンスであり、クラスのインスタンスが実際の型を持つ必要があるためです。

def notNull[T]: T => Boolean = _ != null

上記のように notNull を呼び出すと、実際には function1 インスタンスが返されます。

scala> val a = notNull[String]
a: (String) => Boolean = <function1>

scala> a(null)
res5: Boolean = false

scala> a("aa")
res6: Boolean = true

scala> a(5)
<console>:10: error: type mismatch;
 found   : Int(5)
 required: String
       a(5)
         ^

これは、val を一般的に型指定できない理由を示していると思います。

于 2012-11-16T04:04:05.057 に答える